";
}
function updateRecord () {
//print " Updating domain ...";
if (!$_REQUEST['domain_filter']) return false;
if (!$domain = $this->getRecord($_REQUEST['domain_filter'])) {
return false;
}
$domain_old=$domain;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$domain->$item = intval($_REQUEST[$var_name]);
} else {
$domain->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$domain->$item = intval($_REQUEST[$var_name]);
} else {
$domain->$item = trim($_REQUEST[$var_name]);
}
}
}
$function=array('commit' => array('name' => 'updateDomain',
'parameters' => array($domain),
'logs' => array('success' => sprintf('Domain %s has been updated',$domain->domain)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function hide_html() {
if ($_REQUEST['action'] == 'Export') {
return true;
} else {
return false;
}
}
function exportDomain($domain) {
$exported_data= array();
// Filter
$filter=array(
'domain' => $domain,
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 1000
);
// Compose query
$Query=array('filter' => $filter,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$i = 0 ;
while ($i < $result->total) {
$domain = $result->domains[$i];
if (!in_array($domain->customer, $export_customers)) {
$export_customers[]=$domain->customer;
}
if (!in_array($domain->reseller, $export_customers)) {
$export_customers[]=$domain->reseller;
}
$i+=1;
$exported_data['sip_domains'][] = objectToArray($domain);
}
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,'getAccounts'),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['sip_accounts'] = objectToArray($result->accounts);
foreach ($result->accounts as $account) {
if (!in_array($account->owner, $export_customers)) {
$export_customers[]=$account->owner;
}
$sipId=array("username" => $account->id->username,
"domain" => $account->id->domain
);
$this->SoapEngine->soapclientVoicemail->addHeader($this->SoapEngine->SoapAuthVoicemail);
$result = $this->SoapEngine->soapclientVoicemail->getAccount($sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") {
printf (" Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
}
} else {
$exported_data['voicemail_accounts'][] = $result;
}
// Filter
$filter=array('targetUsername' => $account->id->username,
'targetDomain' => $account->id->domain
);
// Range
$range=array('start' => 0,
'count' => 20
);
// Compose query
$Query=array('filter' => $filter,
'range' => $range
);
// Call function
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAliases');
$result = $this->SoapEngine->soapclient->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
} else {
foreach ($result->aliases as $alias) {
$exported_data['sip_aliases'][] = objectToArray($alias);
}
}
}
}
foreach ($export_customers as $customer) {
if (!$customer) {
continue;
}
$filter=array(
'customer' => intval($customer),
);
// Compose query
$Query=array('filter' => $filter
);
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getCustomers');
// Call function
$result = $this->SoapEngine->soapclientCustomers->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['customers'] = objectToArray($result->accounts);
}
}
//print_r($exported_data['customers']);
print_r(json_encode($exported_data));
}
}
class SipAccounts extends Records {
var $selectionActiveExceptions=array('domain');
var $sortElements=array('changeDate' => 'Change date',
'username' => 'Username',
'domain' => 'Domain'
);
var $store_clear_text_passwords=true;
var $default_account_type = 'postpaid';
var $group_filter_list = array('blocked' => 'Blocked',
'quota' => 'Quota Exceeded',
'prepaid' => 'Prepaid',
'free-pstn' => 'PSTN Access',
'anonymous' => 'Anonymous',
'anonymous-reject' => 'Reject Anonymous',
'voicemail' => 'Has Voicemail',
'missed-calls' => 'Missed Calls'
);
function SipAccounts($SoapEngine) {
dprint("init SipAccounts");
$this->filters = array('username' => strtolower(trim($_REQUEST['username_filter'])),
'domain' => strtolower(trim($_REQUEST['domain_filter'])),
'firstname'=> trim($_REQUEST['firstname_filter']),
'lastname' => trim($_REQUEST['lastname_filter']),
'email' => trim($_REQUEST['email_filter']),
'owner' => trim($_REQUEST['owner_filter']),
'customer' => trim($_REQUEST['customer_filter']),
'reseller' => trim($_REQUEST['reseller_filter']),
'group' => trim($_REQUEST['group_filter'])
);
$this->Records($SoapEngine);
if (strlen($this->SoapEngine->call_limit)) {
$this->platform_call_limit = $this->SoapEngine->call_limit;
} else {
$this->platform_call_limit;
}
$this->getTimezones();
}
function getRecordKeys() {
if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) {
$this->filters['username'] = $m[1];
$this->filters['domain'] = $m[2];
}
// Filter
$filter=array('username' => $this->filters['username'],
'domain' => $this->filters['domain'],
'firstName'=> $this->filters['firstname'],
'lastName' => $this->filters['lastname'],
'email' => $this->filters['email'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller']),
'groups' => array($this->filters['group'])
);
// Range
$range=array('start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
// Call function
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->accounts as $account) {
$this->selectionKeys[]=array('username' => $account->id->username,
'domain' => $account->id->domain
);
}
return true;
}
return false;
}
function listRecords() {
$this->getAllowedDomains();
if (preg_match("/^(.*)@(.*)$/",$this->filters['username'],$m)) {
$this->filters['username'] = $m[1];
$this->filters['domain'] = $m[2];
}
$this->showSeachForm();
// Filter
$filter=array('username' => $this->filters['username'],
'domain' => $this->filters['domain'],
'firstName'=> $this->filters['firstname'],
'lastName' => $this->filters['lastname'],
'email' => $this->filters['email'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller']),
'groups' => array($this->filters['group'])
);
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credentials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
// Call function
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $action != 'PerformActions' && $action != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id |
SIP account";
$this->showSortCaret('username');
if ($this->sorting['sortBy'] == 'domain' ) {
print " (domain ";
$this->showSortCaret('domain');
print ")";
}
print " |
Full name |
Email address |
Timezone |
Call limit |
Quota |
Balance |
Owner |
Change date";
$this->showSortCaret('changeDate');
print " |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
if ($this->rows) {
$i=0;
$_prepaid_accounts=array();
while ($i < $maxrows) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
if ($account->prepaid) {
$_prepaid_accounts[]=array("username" => $account->id->username,
"domain" => $account->id->domain
);
}
$i++;
}
if (count($_prepaid_accounts)) {
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getPrepaidStatus');
// Call function
$result1 = $this->SoapEngine->soapclient->getPrepaidStatus($_prepaid_accounts);
if (!(new PEAR)->isError($result1)) {
$j=0;
foreach ($result1 as $_account) {
$_sip_account=sprintf("%s@%s",$_prepaid_accounts[$j]['username'],$_prepaid_accounts[$j]['domain']);
$_prepaid_balance[$_sip_account]=$_account->balance;
$j++;
}
}
}
$i=0;
while ($i < $maxrows) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$index=$this->next+$i+1;
$_url = $this->url.'&'.$this->addFiltersToURL().sprintf("&service=%s&action=Delete",
urlencode($this->SoapEngine->service)
);
if (!$this->filters['domain']) {
$_url .= sprintf("&domain_filter=%s",urlencode($account->id->domain));
}
if (!$this->filters['username']) {
$_url .= sprintf("&username_filter=%s",urlencode($account->id->username));
}
$_url.= sprintf("&key=%s",urlencode($account->id->username));
if ($action == 'Delete' &&
$_REQUEST['key'] == $account->id->username &&
$_REQUEST['domain_filter'] == $account->id->domain) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
if ($account->reseller) {
$reseller_sip_settings_page=$account->reseller;
} else if ($this->SoapEngine->impersonate) {
// use the reseller from the soap engine
$reseller_sip_settings_page=$this->SoapEngine->impersonate;
} else {
// use the reseller from the login
$reseller_sip_settings_page=$this->reseller;
}
if ($this->sip_settings_page) {
$url=sprintf('%s?account=%s@%s&sip_engine=%s',
$this->sip_settings_page,urlencode($account->id->username),$account->id->domain,$this->SoapEngine->sip_engine);
if ($this->adminonly) {
$url .= sprintf('&reseller=%s',$reseller_sip_settings_page);
$url .= sprintf('&adminonly=%s',$this->adminonly);
} else {
if ($account->reseller == $this->reseller) $url .= sprintf('&reseller=%s',$reseller_sip_settings_page);
}
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
$url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element]));
}
$sip_account=sprintf("
%s@%s",$url,$account->id->username,$account->id->domain);
} else {
$sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain);
}
/*
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($account->customer));
*/
if ($account->owner) {
$_owner_url = sprintf
("%s",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($account->owner),
$account->owner
);
} else {
$_owner_url='';
}
$prepaid_account=sprintf("%s@%s",$account->id->username,$account->id->domain);
if ($account->callLimit) {
$callLimit = $account->callLimit;
} else if ($this->platform_call_limit) {
$callLimit = $this->platform_call_limit;
} else {
$callLimit = '';
}
printf("
%s |
%s |
%s %s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$sip_account,
$account->firstName,
$account->lastName,
$account->email,
$account->email,
$account->timezone,
$callLimit,
$account->quota,
$_prepaid_balance[$prepaid_account],
$_owner_url,
$account->changeDate,
$_url,
$actionText
);
$i++;
}
}
print " ";
$this->showPagination($maxrows);
return true;
}
}
function showSeachFormCustom() {
printf ("
Account ",$this->filters['username']);
printf ("@");
if (count($this->allowedDomains) > 0) {
if ($this->filters['domain'] && !in_array($this->filters['domain'],$this->allowedDomains)) {
printf ("",$this->filters['domain']);
} else {
$selected_domain[$this->filters['domain']]='selected';
printf ("\n");
}
} else {
printf ("",$this->filters['domain']);
}
printf (" FN \n",$this->filters['firstname']);
printf (" LN \n",$this->filters['lastname']);
printf (" Email \n",$this->filters['email']);
printf (" Owner \n",$this->filters['owner']);
$selected_group[$this->filters['group']]='selected';
print "";
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['username']) {
$username=$dictionary['username'];
} else {
$username=$_REQUEST['key'];
}
if ($dictionary['domain']) {
$domain=$dictionary['domain'];
} else {
$domain=$this->filters['domain'];
}
if (!strlen($username) || !strlen($domain)) {
print " Error: missing SIP account username or domain. ";
return false;
}
$account=array('username' => $username,
'domain' => $domain
);
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array($account),
'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$_REQUEST['key'],$this->filters['domain'])
)
)
);
foreach (array_keys($this->filters) as $_filter) {
if ($_filter == 'username' || $_filter == 'domain') continue;
$new_filters[$_filter]=$this->filters[$_filter];
}
$this->filters=$new_filters;
return $this->SoapEngine->execute($function,$this->html);
}
function showAddForm() {
if ($this->filters['username']) return;
if (!count($this->allowedDomains)) {
print " You must create at least one SIP domain before adding SIP accounts ";
return false;
}
printf ("
";
}
function addRecord($dictionary=array()) {
dprint_r($dictionary);
if ($dictionary['account']) {
$account_els = explode("@", $dictionary['account']);
$this->skipSaveProperties=true;
} else {
$account_els = explode("@", trim($_REQUEST['account']));
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
$username=$account_els[0];
if (strlen($account_els[1])) {
$domain=$account_els[1];
} else if ($dictionary['domain']) {
$domain=$dictionary['domain'];
} else if ($_REQUEST['domain']) {
$domain=trim($_REQUEST['domain']);
} else {
printf ("Error: Missing SIP domain");
return false;
}
if (!$this->validDomain($domain)) {
print "Error: invalid domain name";
return false;
}
if ($dictionary['fullname']) {
$name_els = explode(" ", $dictionary['fullname']);
} else {
$name_els = explode(" ", trim($_REQUEST['fullname']));
}
if (strlen($name_els[0])) {
$firstName=$name_els[0];
} else {
$firstName='Account';
}
if (strlen($name_els[1])) {
$j=1;
while ($j < count($name_els)) {
$lastName .= $name_els[$j].' ';
$j++;
}
} else {
if ($username=="") {
$lastName="Unknown";
} else {
$lastName=$username;
}
}
$lastName=trim($lastName);
if (strlen($dictionary['timezone'])) {
$timezone=$dictionary['timezone'];
} else if (strlen(trim($_REQUEST['timezone']))) {
$timezone=trim($_REQUEST['timezone']);
} else if ($this->SoapEngine->default_timezone) {
$timezone=$this->SoapEngine->default_timezone;
} else {
$timezone='Europe/Amsterdam';
}
if (!in_array($timezone,$this->timezones)) {
$timezone='Europe/Amsterdam';
}
if (strlen($dictionary['password'])) {
$password=$dictionary['password'];
} else if (strlen(trim($_REQUEST['password']))) {
$password=trim($_REQUEST['password']);
} else {
$password=$this->RandomString(10);
}
if (is_array($dictionary['groups'])) {
$groups=$dictionary['groups'];
} else {
$groups=array();
}
if (is_array($dictionary['ip_access_list'])) {
$ip_access_list=$dictionary['ip_access_list'];
} else {
$ip_access_list=array();
}
if (strlen($dictionary['call_limit'])) {
$call_limit=$dictionary['call_limit'];
} else {
$call_limit=$_REQUEST['call_limit'];
}
if($dictionary['pstn'] || $_REQUEST['pstn']) {
$_pstn=1;
$groups[]='free-pstn';
} else {
$_pstn=0;
}
if (strlen($dictionary['email'])) {
$email=$dictionary['email'];
} else {
$email=trim($_REQUEST['email']);
}
if (strlen($dictionary['rpid'])) {
$rpid=$dictionary['rpid'];
} else {
$rpid=trim($_REQUEST['rpid']);
}
if (strlen($dictionary['owner'])) {
$owner=intval($dictionary['owner']);
} else {
$owner=intval($_REQUEST['owner']);
}
if (!$owner) {
$owner = intval($customer);
}
if (strlen($dictionary['quota'])) {
$quota=intval($dictionary['quota']);
} else {
$quota=intval($_REQUEST['quota']);
}
if ($this->prepaidChangesAllowed()) {
if (strlen($dictionary['prepaid'])) {
$prepaid=intval($dictionary['prepaid']);
} else {
$prepaid=intval($_REQUEST['prepaid']);
}
} else {
$prepaid = 1;
}
if ($prepaid) {
$groups[]='prepaid';
}
if (!$email) {
if ($username=="") {
$email='unknown@'.strtolower($domain);
} else {
$email=strtolower($username).'@'.strtolower($domain);
}
}
if (!$this->skipSaveProperties) {
$_p=array(
array('name' => 'sip_accounts_last_domain',
'category' => 'web',
'value' => "$domain",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_username',
'category' => 'web',
'value' => "$username",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_timezone',
'category' => 'web',
'value' => "$timezone",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_quota',
'category' => 'web',
'value' => "$quota",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_pstn',
'category' => 'web',
'value' => "$_pstn",
'permission' => 'customer'
),
array('name' => 'sip_accounts_last_prepaid',
'category' => 'web',
'value' => "$prepaid",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
if (is_array($dictionary['properties'])) {
$properties=$dictionary['properties'];
} else {
$properties=array();
}
if ($this->SoapEngine->login_credentials['reseller']) {
$reseller_properties=$this->getResellerProperties($this->SoapEngine->login_credentials['reseller'],'store_clear_text_passwords');
if (strlen($reseller_properties['store_clear_text_passwords'])) {
$this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords'];
}
} else {
$_reseller=$this->getResellerForDomain(strtolower($domain));
if ($_reseller) {
$reseller_properties=$this->getResellerProperties($_reseller,'store_clear_text_passwords');
if (strlen($reseller_properties['store_clear_text_passwords'])) {
$this->store_clear_text_passwords=$reseller_properties['store_clear_text_passwords'];
}
}
}
if ($this->store_clear_text_passwords || $username == '') {
$password_final=$password;
} else {
$md1=strtolower($username).':'.strtolower($domain).':'.$password;
$md2=strtolower($username).'@'.strtolower($domain).':'.strtolower($domain).':'.$password;
$password_final=md5($md1).':'.md5($md2);
}
$account=array(
'id' => array('username' => strtolower($username),
'domain' => strtolower($domain)
),
'firstName' => $firstName,
'lastName' => $lastName,
'password' => $password_final,
'timezone' => $timezone,
'email' => strtolower($email),
'owner' => $owner,
'rpid' => $rpid,
'groups' => $groups,
'prepaid' => $prepaid,
'quota' => $quota,
'acl' => $ip_access_list,
'properties' => $properties
);
if (isset($call_limit)) {
$account['callLimit'] = intval($call_limit);
}
//print_r($account);
$deleteAccount=array('username' => $username,
'domain' => $domain);
if ($this->html) {
if ($username == '') {
$success_log=sprintf('SIP account has been generated in domain %s',$domain);
} else {
$success_log=sprintf('SIP account %s@%s has been added',$username,$domain);
}
}
$function=array('commit' => array('name' => 'addAccount',
'parameters' => array($account),
'logs' => array('success' => $success_log))
);
return $this->SoapEngine->execute($function,$this->html);
}
function getAllowedDomains() {
// Filter
$filter=array(
'domain' => ''
);
// Range
$range=array('start' => 0,
'count' => 500
);
$orderBy = array('attribute' => 'domain',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error in getAllowedDomains from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
//return false;
} else {
foreach ($result->domains as $_domain) {
if ($this->validDomain($_domain->domain)) {
$this->allowedDomains[]=$_domain->domain;
}
}
}
}
function showPasswordReminderForm($accounts=array()) {
printf ("
");
}
function showPasswordReminderUpdateFormEncrypted($id, $account) {
if ($account) {
printf ("
";
print _(" Please choose new passwords for your account, if you leave them empty no change will be performed ");
print " ";
print "
");
}
}
function showPasswordReminderFormEncrypted($accounts=array()) {
printf ("
");
if(count($accounts) < 1 && $_REQUEST['sip_filter']) {
print "";
}
}
function getAccountsForPasswordReminderEncrypted($maximum_accounts=5) {
$accounts=array();
//$filter = array('email' => $this->filters['email']);
if ($_REQUEST['sip_filter']) {
list($username,$domain)=explode('@',trim($_REQUEST['sip_filter']));
if ($username && $domain) {
$filter = array('username' => $username,
'domain' => $domain,
'email' => $this->filters['email']
);
}
} else {
$filter = array('email' => $this->filters['email']);
}
$range = array('start' => 0,
'count' => $maximum_accounts);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC');
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
} else {
$i=0;
while ($i < $result->total) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$accounts[]=array('username'=> $account->id->username,
'domain' => $account->id->domain
);
$i++;
}
}
return $accounts;
}
function getAccountsForPasswordReminder($maximum_accounts=5) {
$accounts=array();
$filter = array('email' => $this->filters['email']);
if ($_REQUEST['sip_filter']) {
list($username,$domain)=explode('@',trim($_REQUEST['sip_filter']));
if ($username && $domain) {
$filter = array( 'username' => $username,
'domain' => $domain
);
}
}
$range = array('start' => 0,
'count' => $maximum_accounts);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC');
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccounts');
$result = $this->SoapEngine->soapclient->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
} else {
$i=0;
while ($i < $result->total) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$accounts[]=array('username'=> $account->id->username,
'domain' => $account->id->domain
);
$i++;
}
}
return $accounts;
}
function getResellerForDomain($domain='') {
// Filter
$filter=array(
'domain' => $domain
);
// Range
$range=array('start' => 0,
'count' => 1
);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
// Call function
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->domains[0]){
return $result->domains[0]->reseller;
} else {
return false;
}
}
}
function getResellerProperties($reseller='',$property='') {
$properties=array();
if (!$this->SoapEngine->customer_engine) {
dprint ("No customer_engine available");
return true;
}
if (!$reseller) {
dprint ("No customer provided");
return true;
}
if (!$property) {
dprint ("No property provided");
return true;
}
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers);
$result = $this->SoapEngine->soapclientCustomers->getProperties(intval($reseller));
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
}
foreach ($result as $_property) {
$properties[$_property->name]=$_property->value;
}
return $properties;
}
function pstnChangesAllowed() {
//dprint_r($this->loginProperties);
$_customer_pstn_changes=$this->getCustomerProperty('pstn_changes');
$_reseller_pstn_changes=$this->getCustomerProperty('pstn_changes');
if ($this->adminonly) {
return true;
} else if ($this->customer == $this->reseller && $_reseller_pstn_changes) {
return true;
} else if ($this->loginImpersonate == $this->reseller && $_reseller_pstn_changes) {
return true;
} else if ($_reseller_pstn_changes && $_customer_pstn_changes) {
return true;
}
return false;
}
function prepaidChangesAllowed() {
//dprint_r($this->loginProperties);
$_customer_prepaid_changes=$this->getCustomerProperty('prepaid_changes');
$_reseller_prepaid_changes=$this->getCustomerProperty('prepaid_changes');
if ($this->adminonly) {
return true;
} else if ($this->customer == $this->reseller && $_reseller_prepaid_changes) {
return true;
} else if ($this->loginImpersonate == $this->reseller && $_reseller_prepaid_changes) {
return true;
} else if ($_reseller_prepaid_changes && $_customer_prepaid_changes) {
return true;
}
return false;
}
function getTimezones () {
$this->timezones=array();
if (!$fp = fopen("timezones", "r")) {
print _("Failed to open timezone file.");
return false;
}
while ($buffer = fgets($fp,1024)) {
$this->timezones[]=trim($buffer);
}
fclose($fp);
}
function showTextBeforeCustomerSelection() {
print _("Domain owner");
}
}
class SipAliases extends Records {
var $selectionActiveExceptions=array('alias_domain');
function SipAliases($SoapEngine) {
dprint("init SipAliases");
$target_filters_els=explode("@",trim($_REQUEST['target_username_filter']));
$target_username=$target_filters_els[0];
if (count($target_filters_els) > 1) {
$target_domain=$target_filters_els[1];
}
$this->filters = array('alias_username' => strtolower(trim($_REQUEST['alias_username_filter'])),
'alias_domain' => strtolower(trim($_REQUEST['alias_domain_filter'])),
'target_username' => strtolower($target_username),
'target_domain' => strtolower($target_domain)
);
$this->Records($SoapEngine);
$this->sortElements=array(
'changeDate' => 'Change date',
'aliasUsername' => 'Alias user',
'aliasDomain' => 'Alias domain',
'targetUsername' => 'Target user',
'targetDomain' => 'Target domain',
);
}
function getRecordKeys() {
// Filter
$filter=array('aliasUsername' => $this->filters['alias_username'],
'aliasDomain' => $this->filters['alias_domain'],
'targetUsername' => $this->filters['target_username'],
'targetDomain' => $this->filters['target_domain'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'aliasUsername';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
//dprint_r($Query);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAliases');
// Call function
$result = $this->SoapEngine->soapclient->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->aliases as $alias) {
$this->selectionKeys[]=array('username' => $alias->id->username,
'domain' => $alias->id->domain);
}
return true;
}
}
function listRecords() {
$this->getAllowedDomains();
// Make sure we apply the domain filter from the login credetials
$this->showSeachForm();
// Filter
$filter=array('aliasUsername' => $this->filters['alias_username'],
'aliasDomain' => $this->filters['alias_domain'],
'targetUsername' => $this->filters['target_username'],
'targetDomain' => $this->filters['target_domain'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAliases');
// Call function
$result = $this->SoapEngine->soapclient->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id |
SIP alias |
Redirect target |
Owner |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->aliases[$i]) break;
$alias = $result->aliases[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&alias_username_filter=%s&alias_domain_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($alias->id->username),
urlencode($alias->id->domain)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['alias_username_filter'] == $alias->id->username &&
$_REQUEST['alias_domain_filter'] == $alias->id->domain) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
/*
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($alias->customer)
);
*/
$_sip_accounts_url = $this->url.sprintf("&service=sip_accounts@%s&username_filter=%s&domain_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($alias->target->username),
urlencode($alias->target->domain)
);
if ($alias->owner) {
$_owner_url = sprintf
("%s",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($alias->owner),
$alias->owner
);
} else {
$_owner_url='';
}
printf("
%s |
%s@%s |
%s@%s |
%s |
%s |
%s |
",
$index,
$alias->id->username,
$alias->id->domain,
$_sip_accounts_url,
$alias->target->username,
$alias->target->domain,
$_owner_url,
$alias->changeDate,
$_url,
$actionText
);
$i++;
}
}
print " ";
$this->showPagination($maxrows);
/*
$_properties=array(
array('name' => $this->SoapEngine->port.'_sortBy',
'value' => $this->sorting['sortBy'],
'permission' => 'customer',
'category' => 'web'
),
array('name' => $this->SoapEngine->port.'_sortOrder',
'value' => $this->sorting['sortOrder'],
'permission' => 'customer',
'category' => 'web'
)
);
print_r($_properties);
$this->setCustomerProperties($_properties);
*/
return true;
}
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print " Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['alias_username']) {
$alias_username=$dictionary['alias_username'];
} else {
$alias_username=$this->filters['alias_username'];
}
if ($dictionary['alias_domain']) {
$alias_domain=$dictionary['alias_domain'];
} else {
$alias_domain=$this->filters['alias_domain'];
}
if (!strlen($alias_username) || !strlen($alias_domain)) {
print " Error: missing SIP alias username or domain. ";
return false;
}
$alias=array('username' => $alias_username,
'domain' => $alias_domain
);
$function=array('commit' => array('name' => 'deleteAlias',
'parameters' => array($alias),
'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$this->filters['alias_username'],$this->filters['alias_domain'])
)
)
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf (" SIP alias ",$this->filters['alias_username']);
printf ("@");
if (count($this->allowedDomains) > 0) {
if ($this->filters['alias_domain'] && !in_array($this->filters['alias_domain'],$this->allowedDomains)) {
printf (" ",$this->filters['alias_domain']);
} else {
$selected_domain[$this->filters['alias_domain']]='selected';
printf (" ");
}
} else {
printf (" ",$this->filters['alias_domain']);
}
printf (" Redirect target ",trim($_REQUEST['target_username_filter']));
printf (" Owner ",$this->filters['owner']);
}
function showAddForm() {
if ($this->selectionActive) return;
if (!count($this->allowedDomains)) {
print " You must create at least one SIP domain before adding SIP aliases";
return false;
}
printf (" ";
}
function addRecord($dictionary=array()) {
if ($dictionary['alias']) {
$alias_els = explode("@", $dictionary['alias']);
$this->skipSaveProperties=true;
} else {
$alias_els = explode("@", trim($_REQUEST['alias']));
}
if ($dictionary['target']) {
$target_els = explode("@", $dictionary['target']);
} else {
$target_els = explode("@", trim($_REQUEST['target']));
}
if ($dictionary['owner']) {
$owner = $dictionary['owner'];
} else {
$owner = $_REQUEST['owner'];
}
if (preg_match("/:(.*)$/",$target_els[0],$m)) {
$target_username=$m[1];
} else {
$target_username=$target_els[0];
}
if (preg_match("/:(.*)$/",$alias_els[0],$m)) {
$username=$m[1];
} else {
$username=$alias_els[0];
}
if (strlen($alias_els[1])) {
$domain=$alias_els[1];
} else if (trim($_REQUEST['domain'])) {
$domain=trim($_REQUEST['domain']);
} else {
if ($this->html) {
printf (" Error: Missing SIP domain");
}
return false;
}
if (!$this->validDomain($domain)) {
if ($this->html) {
print "Error: invalid domain name";
}
return false;
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!$this->skipSaveProperties=true) {
$_p=array(
array('name' => 'sip_aliases_last_domain',
'category' => 'web',
'value' => strtolower($domain),
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$alias=array(
'id' => array('username' => strtolower($username),
'domain' => strtolower($domain)
),
'target' => array('username' => strtolower($target_username),
'domain' => strtolower($target_els[1])
),
'owner' => intval($owner)
);
$deleteAlias=array('username' => strtolower($username),
'domain' => strtolower($domain)
);
$function=array('commit' => array('name' => 'addAlias',
'parameters' => array($alias),
'logs' => array('success' => sprintf('SIP alias %s@%s has been added',$username,$domain)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function getAllowedDomains() {
// Filter
$filter=array(
'domain' => ''
);
// Range
$range=array('start' => 0,
'count' => 500
);
$orderBy = array('attribute' => 'domain',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getDomains');
$result = $this->SoapEngine->soapclient->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->domains as $_domain) {
if ($this->validDomain($_domain->domain)) {
$this->allowedDomains[]=$_domain->domain;
}
}
}
}
function showTextBeforeCustomerSelection() {
print _("Domain owner");
}
}
class EnumRanges extends Records {
var $selectionActiveExceptions=array('tld');
var $record_generator='';
// only admin can add prefixes below
var $deniedPrefixes=array('1','20','210','211','212','213','214','215','216','217','218','219','220','221','222','223','224','225','226','227','228','229','230','231','232','233','234','235','236','237','238','239','240','241','242','243','244','245','246','247','248','249','250','251','252','253','254','255','256','257','258','259','260','261','262','263','264','265','266','267','268','269','27','280','281','282','283','284','285','286','287','288','289','290','291','292','293','294','295','296','297','298','299','30','31','32','33','34','350','351','352','353','354','355','356','357','358','359','36','370','371','372','373','374','375','376','377','378','379','380','381','382','383','384','385','386','387','388','389','39','40','41','420','421','422','423','424','425','426','427','428','429','43','44','45','46','47','48','49','500','501','502','503','504','505','506','507','508','509','51','52','53','54','55','56','57','58','590','591','592','593','594','595','596','597','598','599','60','61','62','63','64','65','66','670','671','672','673','674','675','676','677','678','679','680','681','682','683','684','685','686','687','688','689','690','691','692','693','694','695','696','697','698','699','7','800','801','802','803','804','805','806','807','808','809','81','82','830','831','832','833','834','835','836','837','838','839','84','850','851','852','853','854','855','856','857','858','859','86','870','871','872','873','874','875','876','877','878','879','880','881','882','883','884','885','886','887','888','889','890','891','892','893','894','895','896','897','898','899','90','91','92','93','94','95','960','961','962','963','964','965','966','967','968','969','970','971','972','973','974','975','976','977','978','979','98','990','991','992','993','994','995','996','997','998','999');
var $FieldsAdminOnly=array(
'reseller' => array('type'=>'integer',
'help' => 'Range owner')
);
var $Fields=array(
'customer' => array('type'=>'integer',
'help' => 'Range owner'
),
'serial' => array('type'=>'integer',
'help'=>'DNS serial number',
'readonly' => 1
),
'ttl' => array('type'=>'integer',
'help'=>'Cache period in DNS clients'
),
'info' => array('type'=>'string',
'help' =>'Range description'
),
'size' => array('type'=>'integer',
'help'=>'Maximum number of telephone numbers'
),
'minDigits' => array('type'=>'integer',
'help'=>'Minimum number of digits for telephone numbers'
),
'maxDigits' => array('type'=>'integer',
'help'=>'Maximum number of digits for telephone numbers'
)
);
function EnumRanges($SoapEngine) {
dprint("init EnumRanges");
$this->filters = array('prefix' => trim(ltrim($_REQUEST['prefix_filter']),'+'),
'tld' => trim($_REQUEST['tld_filter']),
'info' => trim($_REQUEST['info_filter'])
);
$this->Records($SoapEngine);
$this->sortElements=array('changeDate' => 'Change date',
'prefix' => 'Prefix',
'tld' => 'TLD'
);
/*
$this->Fields['nameservers'] = array('type'=>'text',
'name'=>'Name servers',
'help'=>'Name servers authoritative for this DNS zone'
);
*/
if ($this->login_credentials['reseller_filters'][$this->reseller]['record_generator']) {
//printf ("Engine: %s",$this->SoapEngine->soapEngine);
if (is_array($this->login_credentials['reseller_filters'][$this->reseller]['record_generator'])) {
$_rg=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator'];
if ($_rg[$this->SoapEngine->soapEngine]) {
$this->record_generator=$_rg[$this->SoapEngine->soapEngine];
}
} else {
$this->record_generator=$this->login_credentials['reseller_filters'][$this->reseller]['record_generator'];
}
} else if (strlen($this->SoapEngine->record_generator)) {
$this->record_generator=$this->SoapEngine->record_generator;
}
}
function listRecords() {
$this->getAllowedDomains();
$this->showSeachForm();
// Filter
$filter=array('prefix' => $this->filters['prefix'],
'tld' => $this->filters['tld'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id |
Owner |
Prefix |
TLD |
Serial |
TTL |
Info |
Min |
Max |
Size |
Used |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->ranges[$i]) break;
$range = $result->ranges[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&prefix_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($range->id->prefix),
urlencode($range->id->tld)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$range->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['prefix_filter'] == $range->id->prefix &&
$_REQUEST['tld_filter'] == $range->id->tld) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
if ($this->adminonly) {
$range_url=sprintf('%s',$this->url,$this->SoapEngine->service,$range->reseller,$range->id->prefix,$range->id->tld,$range->id->prefix);
} else {
$range_url=sprintf('%s',$this->url,$this->SoapEngine->service,$range->id->prefix,$range->id->tld,$range->id->prefix);
}
if ($this->record_generator) {
$generator_url=sprintf('+Numbers',$this->url,$this->record_generator,$range->id->prefix,$range->id->tld,$range->maxDigits,$range->reseller);
} else {
$generator_url='';
}
if ($range->size) {
$usage=intval(100*$range->used/$range->size);
$bar=$this->makebar($usage);
} else {
$bar="";
}
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($range->customer)
);
$_nameservers='';
foreach ($range->nameservers as $_ns) {
$_nameservers.= $_ns.' ';
}
printf("
%s |
%s.%s |
+%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s%s |
",
$index,
$_customer_url,
$range->customer,
$range->reseller,
$range_url,
$range->id->tld,
$range->serial,
$range->ttl,
$range->info,
$range->minDigits,
$range->maxDigits,
$range->size,
$range->used,
$bar,
$range->changeDate,
$_url,
$actionText,
$generator_url
);
$i++;
}
}
print " ";
if ($this->rows == 1) {
$this->showRecord($range);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print " Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['prefix']) || !strlen($this->filters['tld'])) {
print " Error: missing ENUM range id ";
return false;
}
$rangeId=array('prefix'=>$this->filters['prefix'],
'tld'=>$this->filters['tld']);
$function=array('commit' => array('name' => 'deleteRange',
'parameters' => array($rangeId),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been deleted',$this->filters['prefix'],$this->filters['tld'])
)
)
);
unset($this->filters);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showAddForm() {
if ($this->selectionActive) return;
printf (" ",$this->filters['tld']);
} else if ($_tld=$this->getCustomerProperty('enum_ranges_last_tld')) {
printf (" ",$_tld);
} else {
printf (" ");
}
printf (" TTL ");
printf (" Min Digits ");
printf (" Max Digits ");
printf (" Info ",$_REQUEST['info']);
$this->printHiddenFormElements();
print "
";
}
function addRecord($dictionary=array()) {
$tld = trim($_REQUEST['tld']);
$prefix = trim($_REQUEST['prefix']);
$size = trim($_REQUEST['size']);
$info = trim($_REQUEST['info']);
if (!strlen($tld)) {
$tld=$this->SoapEngine->default_enum_tld;
}
if (!strlen($tld) || !strlen($prefix) || !is_numeric($prefix)) {
printf (" Error: Missing TLD or prefix. ");
return false;
}
if (!$this->adminonly) {
if (in_array($prefix,$this->deniedPrefixes)) {
print " Error: Only an administrator account can create the prefix coresponding to a country code.";
return false;
}
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!trim($_REQUEST['ttl'])) {
$ttl = 3600;
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
$range = array(
'id' => array(
'prefix' => $prefix,
'tld' => $tld
),
'ttl' => $ttl,
'info' => $info,
'minDigits' => intval(trim($_REQUEST['minDigits'])),
'maxDigits' => intval(trim($_REQUEST['maxDigits'])),
'size' => intval($size),
'customer' => intval($customer),
'reseller' => intval($reseller)
);
$deleteRange = array(
'prefix'=>$prefix,
'tld'=>$tld
);
$_p = array(
array(
'name' => 'enum_ranges_last_tld',
'category' => 'web',
'value' => "$tld",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
$function = array(
'commit' => array(
'name' => 'addRange',
'parameters' => array($range),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been added',$prefix,$tld))
)
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showSeachFormCustom() {
printf (" Prefix ",$this->filters['prefix']);
printf (" TLD");
if (count($this->allowedDomains) > 0) {
$selected_tld[$this->filters['tld']]='selected';
printf (" ");
} else {
printf (" ",$this->filters['tld']);
}
printf (" Info ",$this->filters['info']);
}
function getAllowedDomains() {
// Filter
$filter=array('prefix' => '');
// Range
$range=array('start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach($result->ranges as $range) {
$this->ranges[]=array('prefix' => $range->id->prefix,
'tld' => $range->id->tld,
'minDigits' => $range->minDigits,
'maxDigits' => $range->maxDigits
);
if (in_array($range->id->tld,$this->allowedDomains)) continue;
$this->allowedDomains[]=$range->id->tld;
$seen[$range->id->tld]++;
}
if (!$seen[$this->SoapEngine->default_enum_tld]) {
$this->allowedDomains[]=$this->SoapEngine->default_enum_tld;
}
}
}
function showRecord($range) {
print " ";
print "
";
printf ("";
print "
";
}
function updateRecord () {
//print "Updating range ...";
if (!$_REQUEST['prefix_filter'] || !$_REQUEST['tld_filter']) return;
$rangeid=array('prefix' => $_REQUEST['prefix_filter'],
'tld' => $_REQUEST['tld_filter']
);
if (!$range = $this->getRecord($rangeid)) {
return false;
}
$range_old=$range;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$range->$item = intval($_REQUEST[$var_name]);
} else if ($item == 'nameservers') {
$_txt=trim($_REQUEST[$var_name]);
if (!strlen($_txt)) {
unset($range->$item);
} else {
$_nameservers=array();
$_lines=explode("\n",$_txt);
foreach ($_lines as $_line) {
$_ns=trim($_line);
$_nameservers[]=$_ns;
}
$range->$item=$_nameservers;
}
} else {
$range->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name=$item.'_form';
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$range->$item = intval($_REQUEST[$var_name]);
} else {
$range->$item = trim($_REQUEST[$var_name]);
}
}
}
$function=array('commit' => array('name' => 'updateRange',
'parameters' => array($range),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been updated',$rangeid['prefix'],$rangeid['tld'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function getRecord($rangeid) {
// Filter
if (!$rangeid['prefix'] || !$rangeid['tld']) {
print "Error in getRecord(): Missing prefix or tld";
return false;
}
$filter=array('prefix' => $rangeid['prefix'],
'tld' => $rangeid['tld']
);
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->ranges[0]){
return $result->ranges[0];
} else {
return false;
}
}
}
}
class EnumMappings extends Records {
var $default_ttl = 3600;
var $default_priority = 5;
var $sortElements=array('changeDate' => 'Change date',
'number' => 'Number',
'tld' => 'TLD'
);
var $ranges=array();
var $FieldsReadOnly=array(
'customer',
'reseller'
);
var $Fields=array(
'owner' => array('type'=>'integer'),
'info' => array('type'=>'string')
);
var $mapping_fields=array('id' => 'integer',
'type' => 'string',
'mapto' => 'string',
'priority' => 'integer',
'ttl' => 'integer'
);
var $NAPTR_services=array(
"sip" => array("service"=>"sip",
"webname"=>"SIP",
"schemas"=>array("sip:","sips:")),
"mailto" => array("service"=>"mailto",
"webname"=>"Email",
"schemas"=>array("mailto:")),
"web:http" => array("service"=>"web:http",
"webname"=>"WEB (http)",
"schemas"=>array("http://")),
"web:https" => array("service"=>"web:https",
"webname"=>"WEB (https)",
"schemas"=>array("https://")),
"x-skype:callto" => array("service"=>"x-skype:callto",
"webname"=>"Skype",
"schemas"=>array("callto:")),
"h323" => array("service"=>"h323",
"webname"=>"H323",
"schemas"=>array("h323:")),
"iax" => array("service"=>"iax",
"webname"=>"IAX",
"schemas"=>array("iax:")),
"iax2" => array("service"=>"iax2",
"webname"=>"IAX2",
"schemas"=>array("iax2:")),
"mms" => array("service"=>"mms",
"webname"=>"MMS",
"schemas"=>array("tel:","mailto:")),
"sms" => array("service"=>"sms",
"webname"=>"SMS",
"schemas"=>array("tel:","mailto:")),
"ems" => array("service"=>"ems",
"webname"=>"EMS",
"schemas"=>array("tel:","mailto:")),
"im" => array("service"=>"im",
"webname"=>"IM",
"schemas"=>array("im:")),
"npd:tel" => array("service"=>"npd+tel",
"webname"=>"Portability",
"schemas"=>array("tel:")),
"void:mailto" => array("service"=>"void:mailto",
"webname"=>"VOID(mail)",
"schemas"=>array("mailto:")),
"void:http" => array("service"=>"void:http",
"webname"=>"VOID(http)",
"schemas"=>array("http://")),
"void:https" => array("service"=>"void:https",
"webname"=>"VOID(https)",
"schemas"=>array("https://")),
"voice" => array("service"=>"voice",
"webname"=>"Voice",
"schemas"=>array("voice:","tel:")),
"tel" => array("service"=>"tel",
"webname"=>"Tel",
"schemas"=>array("tel:")),
"fax:tel" => array("service"=>"fax:tel",
"webname"=>"Fax",
"schemas"=>array("tel:")),
"ifax:mailto" => array("service"=>"ifax:mailto",
"webname"=>"iFax",
"schemas"=>array("mailto:")),
"pres" => array("service"=>"pres",
"webname"=>"Presence",
"schemas"=>array("pres:")),
"ft:ftp" => array("service"=>"ft:ftp",
"webname"=>"FTP",
"schemas"=>array("ftp://")),
"loc:http" => array("service"=>"loc:http",
"webname"=>"GeoLocation",
"schemas"=>array("http://")),
"key:http" => array("service"=>"key:http",
"webname"=>"Public key",
"schemas"=>array("http://")),
"key:https" => array("service"=>"key:https",
"webname"=>"Public key (HTTPS)",
"schemas"=>array("https://"))
);
function EnumMappings($SoapEngine) {
dprint("init EnumMappings");
if ($_REQUEST['range_filter']) {
list($_prefix,$_tld_filter)= explode("@",$_REQUEST['range_filter']);
if ($_prefix && !$_REQUEST['number_filter']) {
$_number_filter=$_prefix.'%';
} else {
$_number_filter=$_REQUEST['number_filter'];
}
} else {
$_number_filter=$_REQUEST['number_filter'];
$_tld_filter=trim($_REQUEST['tld_filter']);
}
$_number_filter=ltrim($_number_filter,'+');
$this->filters = array('number' => ltrim($_number_filter,'+'),
'tld' => $_tld_filter,
'range' => trim($_REQUEST['range_filter']),
'type' => trim($_REQUEST['type_filter']),
'mapto' => trim($_REQUEST['mapto_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
$this->Records($SoapEngine);
$this->getAllowedDomains();
}
function listRecords() {
$this->showSeachForm();
$filter=array('number' => $this->filters['number'],
'tld' => $this->filters['tld'],
'type' => $this->filters['type'],
'mapto' => $this->filters['mapto'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumbers');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
|
Range Owner |
Phone number |
TLD |
Info |
Owner |
Type |
Id |
Map to |
TTL |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->numbers[$i]) break;
$number = $result->numbers[$i];
$index=$this->next+$i+1;
$j=1;
foreach ($number->mappings as $_mapping) {
unset($sip_engine);
foreach (array_keys($this->login_credentials['reseller_filters']) as $_res) {
if ($_res == $number->reseller) {
if ($this->login_credentials['reseller_filters'][$_res]['sip_engine']) {
$sip_engine=$this->login_credentials['reseller_filters'][$_res]['sip_engine'];
break;
}
}
}
if (!$sip_engine) {
if ($this->login_credentials['reseller_filters']['default']['sip_engine']) {
$sip_engine=$this->login_credentials['reseller_filters']['default']['sip_engine'];
} else {
$sip_engine=$this->SoapEngine->sip_engine;
}
}
if (preg_match("/^sip:(.*)$/",$_mapping->mapto,$m) && $this->sip_settings_page) {
$url=sprintf('%s?account=%s&reseller=%s&sip_engine=%s',
$this->sip_settings_page,urlencode($m[1]), $number->reseller,$sip_engine);
if ($this->adminonly) $url .= sprintf('&adminonly=%s',$this->adminonly);
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
$url .= sprintf('&%s=%s',$element,urlencode($this->SoapEngine->extraFormElements[$element]));
}
$mapto=sprintf("
sip:%s",$url,$m[1]);
} else {
$mapto=sprintf("%s",$_mapping->mapto);
}
$_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s&mapto_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld),
urlencode($_mapping->mapto)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['number_filter'] == $number->id->number &&
$_REQUEST['tld_filter'] == $number->id->tld &&
$_REQUEST['mapto_filter'] == $_mapping->mapto) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
if ($j==1) {
$_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld)
);
if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($number->customer)
);
if ($number->owner) {
$_owner_url = sprintf
("%s",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($number->owner),
$number->owner
);
} else {
$_owner_url='';
}
printf("
%s |
%s.%s |
+%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$number->customer,
$number->reseller,
$_number_url,
$number->id->number,
$number->id->tld,
$number->info,
$_owner_url,
ucfirst($_mapping->type),
$_mapping->id,
$mapto,
$_mapping->ttl,
$number->changeDate,
$_url,
$actionText
);
} else {
printf("
|
|
|
|
|
|
%s |
%s |
%s |
%s |
%s |
%s |
",
ucfirst($_mapping->type),
$_mapping->id,
$mapto,
$_mapping->ttl,
$number->changeDate,
$_url,
$actionText
);
}
$j++;
}
if (!is_array($number->mappings) || !count($number->mappings)) {
$_url = $this->url.sprintf("&service=%s&action=Delete&number_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld),
urlencode($_mapping->mapto)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$number->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['number_filter'] == $number->id->number &&
$_REQUEST['tld_filter'] == $number->id->tld &&
$_REQUEST['mapto_filter'] == $_mapping->mapto) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
$_number_url = $this->url.sprintf("&service=%s&number_filter=%s&tld_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($number->id->number),
urlencode($number->id->tld)
);
if ($this->adminonly) $_number_url.= sprintf ("&reseller_filter=%s",$number->reseller);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($number->customer)
);
if ($number->owner) {
$_owner_url = sprintf
("%s",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($number->owner),
$number->owner
);
} else {
$_owner_url='';
}
printf("
%s |
%s.%s |
+%s |
%s |
%s |
%s |
|
|
|
%s |
%s |
",
$index,
$_customer_url,
$number->customer,
$number->reseller,
$_number_url,
$number->id->number,
$number->id->tld,
$number->info,
$_owner_url,
$number->changeDate,
$_url,
$actionText
);
}
printf("
");
$i++;
}
}
print " ";
if ($this->rows == 1 ) {
$this->showRecord($number);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function getLastNumber() {
// Filter
$filter=array('number' => ''
);
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumbers');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->total) {
$number = array('number' => $result->numbers[0]->id->number,
'tld' => $result->numbers[0]->id->tld,
'mappings' => $result->numbers[0]->mappings
);
return $number;
}
}
return false;
}
function showSeachFormCustom() {
/*
print " ";
*/
printf (" Number ",$_REQUEST['number_filter']);
printf (" Map to");
print "
";
printf (" ",$this->filters['mapto']);
printf (" Owner ",$this->filters['owner']);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['number']) {
$number=$dictionary['number'];
} else {
$number=$this->filters['number'];
}
if ($dictionary['tld']) {
$tld=$dictionary['tld'];
} else {
$tld=$this->filters['tld'];
}
if ($dictionary['mapto']) {
$mapto=$dictionary['mapto'];
} else {
$mapto=$this->filters['mapto'];
}
if (!strlen($number) || !strlen($tld)) {
print " Error: missing ENUM number or TLD ";
return false;
}
$enum_id=array('number' => $number,
'tld' => $tld
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enum_id);
if (!(new PEAR)->isError($result)) {
// the number exists and we make an update
$result_new=$result;
if (count($result->mappings) > 1) {
foreach ($result->mappings as $_mapping) {
if ($_mapping->mapto != $mapto) {
$mappings_new[]=array('type' => $_mapping->type,
'mapto' => $_mapping->mapto,
'ttl' => $_mapping->ttl,
'priority' => $_mapping->priority,
'id' => $_mapping->id
);
}
}
if (!is_array($mappings_new)) $mappings_new = array();
$result_new->mappings=$mappings_new;
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($result_new),
'logs' => array('success' => sprintf('ENUM mapping %s has been deleted',$mapto)))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
} else {
$function=array('commit' => array('name' => 'deleteNumber',
'parameters' => array($enum_id),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$number,$tld))),
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
unset($this->filters);
} else {
return false;
}
}
function showAddForm() {
if ($this->selectionActive) return;
//if ($this->adminonly && !$this->filters['reseller']) return;
if (!count($this->ranges)) {
//print " You must create at least one ENUM range before adding ENUM numbers";
return false;
}
printf ("
";
}
function getAllowedDomains() {
// Filter
$filter=array('prefix' => '',
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 200
);
// Order
$orderBy = array('attribute' => 'prefix',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach($result->ranges as $range) {
$this->ranges[]=array('prefix' => $range->id->prefix,
'tld' => $range->id->tld,
'minDigits' => $range->minDigits,
'maxDigits' => $range->maxDigits
);
if (in_array($range->id->tld,$this->allowedDomains)) continue;
$this->allowedDomains[]=$range->id->tld;
$seen[$range->id->tld]++;
}
if (!$seen[$this->SoapEngine->default_enum_tld]) {
$this->allowedDomains[]=$this->SoapEngine->default_enum_tld;
}
}
}
function addRecord($dictionary=array()) {
$prefix='';
if ($dictionary['range']) {
list($prefix,$tld)=explode('@',trim($dictionary['range']));
$this->skipSaveProperties=true;
} else if ($dictionary['tld']) {
$tld = $dictionary['tld'];
} else if ($_REQUEST['range']) {
list($prefix,$tld)=explode('@',trim($_REQUEST['range']));
} else {
$tld = trim($_REQUEST['tld']);
}
if ($dictionary['number']) {
$number = $dictionary['number'];
} else {
$number = trim($_REQUEST['number']);
}
$number=$prefix.$number;
if (!strlen($tld)) {
$tld=$this->SoapEngine->default_enum_tld;
}
if (!strlen($tld) || !strlen($number) || !is_numeric($number)) {
printf ("Error: Missing TLD or number. ");
return false;
}
if ($dictionary['ttl']) {
$ttl = intval($dictionary['ttl']);
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if (!$ttl) $ttl=3600;
if ($dictionary['priority']) {
$priority = intval($dictionary['priority']);
} else {
$priority = intval(trim($_REQUEST['priority']));
}
if ($dictionary['owner']) {
$owner = intval($dictionary['owner']);
} else {
$owner = intval(trim($_REQUEST['owner']));
}
if ($dictionary['info']) {
$info = $dictionary['info'];
} else {
$info = trim($_REQUEST['info']);
}
if (!$priority) $priority=5;
$enum_id=array('number' => $number,
'tld' => $tld);
if ($dictionary['mapto']) {
$mapto = $dictionary['mapto'];
} else {
$mapto = trim($_REQUEST['mapto']);
}
if ($dictionary['type']) {
$type = $dictionary['type'];
} else {
$type = trim($_REQUEST['type']);
}
if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else {
$_scheme = '';
$_value = $mapto;
}
if (!$_value) {
$lastNumber=$this->getLastNumber();
foreach($lastNumber['mappings'] as $_mapping) {
if ($_mapping->type == trim($type)) {
if (preg_match("/^(.*)@(.*)$/",$_mapping->mapto,$m)) {
$_value = $number.'@'.$m[2];
break;
}
}
}
}
if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) {
$_scheme=$this->NAPTR_services[trim($type)]['schemas'][0];
}
$mapto=$_scheme.$_value;
$enum_number=array('id' => $enum_id,
'owner' => $owner,
'info' => $info,
'mappings' => array(array('type' => $type,
'mapto' => $mapto,
'ttl' => $ttl,
'priority' => $priority
)
)
);
if (!$this->skipSaveProperties=true) {
$_p=array(
array('name' => 'enum_numbers_last_range',
'category' => 'web',
'value' => $_REQUEST['range'],
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_type',
'category' => 'web',
'value' => "$type",
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_number',
'category' => 'web',
'value' => "$number",
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_ttl',
'category' => 'web',
'value' => "$ttl",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($result)) {
$error_msg=$result->getMessage();
$error_fault=$result->getFault();
$error_code=$result->getCode();
if ($error_fault->detail->exception->errorcode == "3002") {
$function=array('commit' => array('name' => 'addNumber',
'parameters' => array($enum_number),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been added',$number,$tld)))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
}
} else {
// the number exists and we make an update
$result_new=$result;
foreach ($result->mappings as $_mapping) {
$mappings_new[]=array('type' => $_mapping->type,
'mapto' => $_mapping->mapto,
'ttl' => $_mapping->ttl,
'priority' => $_mapping->priority,
'id' => $_mapping->id
);
if ($_mapping->mapto == $mapto) {
printf (" Info: ENUM mapping %s for number %s already exists",$mapto,$number);
return $result;
}
}
$mappings_new[]=array('type' => trim($type),
'mapto' => $mapto,
'ttl' => intval(trim($_REQUEST['ttl'])),
'priority'=> intval(trim($_REQUEST['priority'])),
);
// add mapping
$result_new->mappings=$mappings_new;
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($result_new),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$number,$tld)))
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
}
function getRecordKeys() {
// Filter
$filter=array('number' => $this->filters['number'],
'tld' => $this->filters['tld'],
'type' => $this->filters['type'],
'mapto' => $this->filters['mapto'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 1000
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumberss');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->numbers as $number) {
$this->selectionKeys[]=array('number' => $number->id->number,
'tld' => $number->id->tld);
}
return true;
}
}
function showRecord($number) {
print " ";
print "";
print "";
print "Number";
print " | ";
print "Mappings";
print " | ";
print " ";
print "";
print "";
print "";
printf ("
";
print " | ";
print "";
print "";
print " | ";
print "Id | ";
print "Type | ";
print "Map to | ";
print "TTL | ";
print " ";
foreach ($number->mappings as $_mapping) {
$j++;
unset($selected_type);
print "";
print "$j | ";
printf ("%d | ",$_mapping->id,$_mapping->id);
$selected_type[$_mapping->type]='selected';
printf ("
| ";
printf ("
|
|
",
$_mapping->mapto,
$_mapping->ttl
);
print " ";
}
$j++;
print "";
print " | ";
print " | ";
printf ("
| ";
printf ("
|
|
"
);
print " ";
print " ";
print " | ";
print " ";
print "
|
";
print "";
print " ";
}
function getRecord($enumid) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enumid);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return $result;
}
}
function updateRecord () {
//print "Updating number ...";
if (!$_REQUEST['number_filter'] || !$_REQUEST['tld_filter']) return;
$enumid=array('number' => $_REQUEST['number_filter'],
'tld' => $_REQUEST['tld_filter']
);
if (!$number = $this->getRecord($enumid)) {
return false;
}
$number_old=$number;
$new_mappings=array();
/*
foreach ($number->mappings as $_mapping) {
foreach (array_keys($this->mapping_fields) as $field) {
if ($this->mapping_fields[$field] == 'integer') {
$new_mapping[$field]=intval($_mapping->$field);
} else {
$new_mapping[$field]=$_mapping->$field;
}
}
$new_mappings[]=$new_mapping;
}
*/
$j=0;
while ($j< count($_REQUEST['mapping_type'])) {
$mapto = $_REQUEST['mapping_mapto'][$j];
$type = $_REQUEST['mapping_type'][$j];
$id = $_REQUEST['mapping_id'][$j];
$ttl = intval($_REQUEST['mapping_ttl'][$j]);
$priority = intval($_REQUEST['mapping_priority'][$j]);
if (!$ttl) $ttl = $this->default_ttl;
if (!$priority) $priority = $this->default_priority;
if (strlen($mapto)) {
if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else if (preg_match("/^([a-z0-9]+:)(.*)$/i",$mapto,$m)) {
$_scheme = $m[1];
$_value = $m[2];
} else {
$_scheme = '';
$_value = $mapto;
}
reset($this->NAPTR_services);
if (!$_scheme || !in_array($_scheme,$this->NAPTR_services[trim($type)]['schemas'])) {
$_scheme=$this->NAPTR_services[trim($type)]['schemas'][0];
}
$mapto=$_scheme.$_value;
$new_mappings[]=array( 'type' => $type,
'ttl' => $ttl,
'id' => intval($id),
'mapto' => $mapto,
'priority' => $priority
);
}
$j++;
}
$number->mappings=$new_mappings;
if (!is_array($number->mappings)) $number->mappings=array();
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$number->$item = intval($_REQUEST[$var_name]);
} else {
$number->$item = trim($_REQUEST[$var_name]);
}
}
//print_r($number);
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$enumid['number'],$enumid['tld'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result) ;
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showTextBeforeCustomerSelection() {
print _("Range owner");
}
}
class DnsZones extends Records {
var $FieldsAdminOnly=array(
'reseller' => array('type'=>'integer',
'help' => 'Zone owner')
);
var $Fields=array(
'customer' => array('type'=>'integer',
'help' => 'Zone owner'
),
'serial' => array('type'=>'integer',
'help'=>'Serial number',
'readonly' => 1
),
'email' => array('type'=>'string',
'help'=>'Administrator address'
),
'ttl' => array('type'=>'integer',
'help'=>'Time to live of SOA record'
),
'minimum' => array('type'=>'integer',
'help'=>'Default time to live period'
),
'retry' => array('type'=>'integer',
'help'=>'Retry transfer period'
),
'expire' => array('type'=>'integer',
'help'=>'Expire period'
),
'info' => array('type'=>'string',
'help' =>'Zone description'
)
);
function DnsZones($SoapEngine) {
dprint("init DnsZones");
$this->filters = array(
'name' => trim($_REQUEST['name_filter']),
'info' => trim($_REQUEST['info_filter'])
);
$this->Records($SoapEngine);
$this->sortElements=array('changeDate' => 'Change date',
'name' => 'Name'
);
$this->Fields['nameservers'] = array('type'=>'text',
'name'=>'Name servers',
'help'=>'Authoritative name servers'
);
}
function showAfterEngineSelection () {
if ($this->SoapEngine->name_servers) {
//printf (" Available name servers: %s",$this->SoapEngine->name_servers);
}
}
function listRecords() {
$this->showSeachForm();
// Filter
$filter=array('name' => $this->filters['name'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id |
Owner |
Zone |
Administrator |
Info |
|
Serial |
Default TTL |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->zones[$i]) break;
$zone = $result->zones[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&name_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($zone->name)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$zone->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['name_filter'] == $zone->name) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
$zone_url=sprintf('%s&service=%s&name_filter=%s',
$this->url,
$this->SoapEngine->service,
$zone->name
);
$records_url = $this->url.sprintf("&service=dns_records@%s&zone_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($zone->name)
);
if ($this->adminonly) $zone_url .= sprintf("&reseller_filter=%s",$zone->reseller);
if ($this->adminonly) $records_url .= sprintf("&reseller_filter=%s",$zone->reseller);
$customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($zone->customer)
);
sort($zone->nameservers);
$ns_text='';
foreach ($zone->nameservers as $ns) {
$ns_text.= $ns." ";
}
printf("
%s |
%s.%s |
%s |
%s |
%s |
Records |
%s |
%s |
%s |
%s |
",
$index,
$customer_url,
$zone->customer,
$zone->reseller,
$zone_url,
$zone->name,
$zone->email,
$zone->info,
$records_url,
$zone->serial,
$zone->ttl,
$zone->changeDate,
$_url,
$actionText
);
printf("
");
$i++;
}
}
print " ";
if ($this->rows == 1) {
$this->showRecord($zone);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['name'])) {
print " Error: missing Dns zone name ";
return false;
}
$name=$this->filters['name'];
$function=array('commit' => array('name' => 'deleteZone',
'parameters' => array($name),
'logs' => array('success' => sprintf('Dns zone %s has been deleted',$this->filters['name'])
)
)
);
unset($this->filters);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showAddForm() {
if ($this->selectionActive) return;
printf ("
";
}
function addRecord($dictionary=array()) {
$name = trim($_REQUEST['name']);
$info = trim($_REQUEST['info']);
$name_servers = trim($_REQUEST['name_servers']);
if ($_FILES['import_file']['tmp_name']) {
$content=fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']);
//print_r($content);
if (!$imported_data=json_decode($content, true)) {
printf ("Error: reading imported data. ");
return false;
}
//print_r($imported_data);
if (!in_array('dns_zones', array_keys($imported_data))) {
printf (" Error: Missing zones in imported data. ");
return false;
}
if (!in_array('dns_records', array_keys($imported_data))) {
return false;
printf (" Error: Missing records in imported data. ");
}
foreach($imported_data['customers'] as $customer) {
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$customer['credit'] = floatval($customer['credit']);
$customer['balance'] = floatval($customer['balance']);
// Call function
$this->log_action('addAccount');
$result = $this->SoapEngine->soapclientCustomers->addAccount($customer);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 5001) {
$result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf (" Error: $log");
} else {
printf(' Customer %s has been updated',$customer['id']);
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf (" Error: $log");
}
} else {
printf(' Customer %s has been added',$customer['id']);
}
}
$name_servers = array();
foreach($imported_data['dns_zones'] as $zone) {
flush();
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('addZone');
$result = $this->SoapEngine->soapclient->addZone($zone);
$name_servers[$zone['name']] = $zone['nameservers'];
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 7001) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('updateZone');
$result = $this->SoapEngine->soapclient->updateZone($zone);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf (" Error: $log");
} else {
printf(' Zone %s has been updated',$zone['name']);
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf (" Error: $log");
}
} else {
printf(' Zone %s has been added',$zone['name']);
}
}
$added = 0;
$updated = 0;
foreach($imported_data['dns_records'] as $record) {
flush();
if (in_array($record['name'], $name_servers[$record['zone']]) && $record['type'] == "A") {
continue;
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('addRecord');
$result = $this->SoapEngine->soapclient->addRecord($record);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 7003) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('updateRecord');
$result = $this->SoapEngine->soapclient->updateRecord($record);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf (" Error: $log");
} else {
$added += 1;
}
} else {
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
printf (" Error: $log");
}
} else {
$added += 1;
}
}
printf(' %d DNS records added and %d updated',$added, $updated);
return true;
} else {
if (isset($this->SoapEngine->allow_none_local_dns_zones)) {
$allow_none_local_dns_zones = $this->SoapEngine->allow_none_local_dns_zones;
} else {
$allow_none_local_dns_zones = false;
}
if (!strlen($name)) {
printf (" Error: Missing zone name. ");
return false;
}
$lookup1 = dns_get_record($name);
//dprint_r($lookup1);
$ns_array1=explode(" ",trim($this->SoapEngine->name_servers));
if (empty($lookup1) || $allow_none_local_dns_zones){
$valid = 1;
} else {
$valid = 0;
foreach($lookup1 as $lrecord){
if ($lrecord['type'] == 'NS') {
if(in_array($lrecord['target'],$ns_array1)){
$valid = 1 ;
}
}
}
}
if ($valid==0){
printf ("Error: DNS zone already exists on other server. Please contact our support if you plan to transfer this DNS zone to this system. ");
return false;
}
if (is_numeric($prefix)) {
printf ("Error: Numeric zone names are not allowed. Use ENUM port instead. ");
return false;
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!trim($_REQUEST['ttl'])) {
$ttl=3600;
} else {
$ttl=intval(trim($_REQUEST['ttl']));
}
if ($name_servers) {
$ns_array=explode(" ",trim($name_servers));
} else if ($this->login_credentials['login_type'] != 'admin' && $this->SoapEngine->name_servers){
$ns_array=explode(" ",trim($this->SoapEngine->name_servers));
} else {
$ns_array=array();
}
$zone=array(
'name' => $name,
'ttl' => $ttl,
'info' => $info,
'customer' => intval($customer),
'reseller' => intval($reseller),
'nameservers' => $ns_array
);
$function=array('commit' => array('name' => 'addZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('DNS zone %s has been added',$name)))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
}
function showSeachFormCustom() {
printf (" DNS zone ",$this->filters['name']);
printf (" Info ",$this->filters['info']);
}
function showRecord($zone) {
print "";
print "
";
printf ("";
print "
";
}
function updateRecord () {
if (!$_REQUEST['name_filter']) return;
//dprintf ("Updating zone %s...",$_REQUEST['name_filter']);
$filter=array('name' => $_REQUEST['name_filter']);
if (!$zone = $this->getRecord($filter)) {
return false;
}
$zone_old=$zone;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$zone->$item = intval($_REQUEST[$var_name]);
} else if ($item == 'nameservers') {
$_txt=trim($_REQUEST[$var_name]);
if (!strlen($_txt)) {
unset($zone->$item);
} else {
$_nameservers=array();
$_lines=explode("\n",$_txt);
foreach ($_lines as $_line) {
$_ns=trim($_line);
$_nameservers[]=$_ns;
}
$zone->$item=$_nameservers;
}
} else {
$zone->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name=$item.'_form';
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$zone->$item = intval($_REQUEST[$var_name]);
} else {
$zone->$item = trim($_REQUEST[$var_name]);
}
}
}
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('DNS zone %s has been updated',$filter['name'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function getRecord($zone) {
// Filter
if (!$zone['name']) {
print "Error in getRecord(): Missing zone name";
return false;
}
$filter=array('name' => $zone['name']);
// Range
$range=array('start' => 0,
'count' => 1
);
// Order
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->zones[0]){
return $result->zones[0];
} else {
return false;
}
}
}
function getRecordKeys() {
// Filter
$filter=array('name' => $this->filters['name'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 200
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
// Call function
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->zones as $zone) {
$this->selectionKeys[]=array('name' => $zone->name);
}
return true;
}
}
function hide_html() {
if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') {
return true;
} else {
return false;
}
}
}
class DnsRecords extends Records {
var $max_zones_selection = 50;
var $typeFilter = false;
var $default_ttl = 3600;
var $fancy = false;
var $sortElements = array(
'changeDate' => 'Change date',
'type' => 'Type',
'name' => 'Name'
);
var $FieldsReadOnly = array(
'customer',
'reseller'
);
var $Fields = array(
'type' => array('type'=>'string'),
'priority' => array('type'=>'integer'),
'value' => array('type'=>'string'),
'ttl' => array('type'=>'integer')
);
var $recordTypes = array(
'A' => 'IP address',
'AAAA' => 'IP v6 address',
'CNAME' => 'Hostname alias',
'MX' => 'Mail server address',
'SRV' => 'Server resource',
'NS' => 'Name server address',
'NAPTR' => 'Name authority',
'PTR' => 'Reverse IP address',
'TXT' => 'Text',
'LOC' => 'Geo location'
);
var $havePriority = array('MX','SRV','NAPTR');
var $addRecordFunction = 'addRecord';
var $deleteRecordFunction = 'deleteRecord';
var $updateRecordFunction = 'updateRecord';
var $getRecordsFunction = 'getRecords';
var $getRecordFunction = 'getRecord';
var $recordTypesTemplate = array(
'sip2sip' => array(
'name' => 'SIP2SIP infrastructure',
'records' => array(
'naptr1' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
- 'ttl' => '3600',
- 'value' => '10 100 "s" "SIP+D2T" "" _sip._tcp'
+ 'ttl' => '600',
+ 'value' => '20 100 "s" "SIP+D2T" "" _sip._tcp'
),
'naptr2' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
- 'ttl' => '3600',
+ 'ttl' => '600',
'value' => '30 100 "s" "SIP+D2U" "" _sip._udp'
),
+ 'naptr3' => array(
+ 'name' => '',
+ 'type' => 'NAPTR',
+ 'priority' => '100',
+ 'ttl' => '600',
+ 'value' => '10 100 "s" "SIPS+D2T" "" _sips._tcp'
+ ),
'srv1' => array(
'name' => '_sip._tcp',
'type' => 'SRV',
'priority' => '100',
- 'ttl' => '3600',
+ 'ttl' => '600',
'value' => '100 5060 proxy.sipthor.net'
),
'srv2' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '100',
- 'ttl' => '3600',
+ 'ttl' => '600',
'value' => '100 5060 proxy.sipthor.net'
),
'srv3' => array(
- 'name' => '_stun._udp',
+ 'name' => '_sips._tls',
'type' => 'SRV',
- 'priority' => '0',
- 'value' => '10 3478 stun1.dns-hosting.info'
+ 'priority' => '100',
+ 'ttl' => '600',
+ 'value' => '100 443 proxy.sipthor.net'
),
'srv4' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
- 'value' => '10 3478 stun2.dns-hosting.info'
+ 'value' => '10 3478 stun1.sipthor.net'
),
'srv5' => array(
+ 'name' => '_stun._udp',
+ 'type' => 'SRV',
+ 'priority' => '0',
+ 'value' => '10 3478 stun2.sipthor.net'
+ ),
+ 'srv6' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay.sipthor.net'
),
'txt1' => array(
'name' => 'xcap',
'type' => 'TXT',
'priority' => '10',
'value' => 'https://xcap.sipthor.net/xcap-root'
)
),
),
'siptcp' => array(
'name' => 'SIP - TCP transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '10 100 "s" "SIP+D2T" "" _sip._tcp'
),
'srv' => array(
'name' => '_sip._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5060 #VALUE#|10 5060 sip'
)
),
),
'siptls' => array(
'name' => 'SIP - TLS transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '20 100 "s" "SIPS+D2T" "" _sips._tcp'
),
'srv' => array(
'name' => '_sips._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5061 #VALUE#|10 5061 sip'
)
)
),
'sipudp' => array(
'name' => 'SIP - UDP transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '30 100 "s" "SIP+D2U" "" _sip._udp'
),
'srv' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5060 #VALUE#|10 5060 sip'
)
),
),
'stun' => array(
'name' => 'STUN - NAT mirror',
'records' => array(
'srv' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 #VALUE#|10 3478 stun'
)
),
),
'xmpp-server' => array(
'name' => 'XMPP server',
'records' => array(
'srv' => array(
'name' => '_xmpp-server._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
),
'srv1' => array(
'name' => '_jabber._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
)
),
),
'xmpp-client' => array(
'name' => 'XMPP client',
'records' => array(
'srv' => array(
'name' => '_xmpp-client._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5222 #VALUE#|10 5222 xmpp'
)
),
),
'msrp' => array(
'name' => 'MSRP - IM relay',
'records' => array(
'srv' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay'
)
)
),
'sipthor' => array(
'name' => 'SIP - Thor network',
'records' => array(
'eventserver' => array(
'name' => '_eventserver._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 8000 eventserver'
),
'sipserver' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '10',
'value' => '30 5060 proxy'
),
'sipns1' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns1'
),
'sipns2' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns2'
),
'sipns3' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns3'
),
'ngnproserver' => array(
'name' => '_ngnpro._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 9200 ngnpro'
),
'ngnns1' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns1'
),
'ngnns2' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns2'
),
'ngnns3' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns3'
),
'xcapserver' => array(
'name' => '_xcap._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 443 xcap'
),
'xcapns1' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns1'
),
'xcapns2' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns2'
),
'xcapns3' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns3'
),
'msrpserver' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay'
),
'msrpns1' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns1'
),
'msrpns2' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns2'
),
'msrpns3' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns3'
),
'voicemail' => array(
'name' => '_voicemail._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 9200 voicemail'
),
'vmns1' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns1'
),
'vmns2' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns2'
),
'vmns3' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns3'
)
)
)
);
function DnsRecords($SoapEngine) {
dprint("init DnsRecords");
$_name = trim($_REQUEST['name_filter']);
if (strlen($_name) && !strstr($_name,'.') && !strstr($_name,'%')) {
$_name .= '%';
}
if ($this->typeFilter) {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'zone' => trim($_REQUEST['zone_filter']),
'name' => $_name,
'type' => $this->typeFilter,
'value' => trim($_REQUEST['value_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
} else {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'zone' => trim($_REQUEST['zone_filter']),
'name' => $_name,
'type' => trim($_REQUEST['type_filter']),
'value' => trim($_REQUEST['value_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
}
$this->Records($SoapEngine);
$this->getAllowedDomains();
}
function listRecords() {
$this->showSeachForm();
if ($this->typeFilter) {
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->typeFilter,
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
} else {
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->filters['type'],
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
}
// Range
$range = array(
'start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action($this->getRecordsFunction);
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows > 1 && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found. Click on record id to edit the values.
";
if ($this->fancy) {
print "
|
Zone owner |
Zone |
Id |
Name |
Type |
Value |
Owner |
Change date |
Actions |
";
} else {
print "
|
Zone owner |
Zone |
Id |
Name |
Type |
Priority |
Value |
TTL |
Change date |
Actions |
";
}
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->records[$i]) {
break;
}
$record = $result->records[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf(
"&service=%s&action=Delete&name_filter=%s&zone_filter=%s&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($record->name),
urlencode($record->zone),
urlencode($record->id)
);
if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s",$record->reseller);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $record->id) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
$_customer_url = $this->url.sprintf(
"&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($record->customer)
);
$_zone_url = $this->url.sprintf(
"&service=dns_zones@%s&name_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($record->zone)
);
if ($this->adminonly) {
$_zone_url.= sprintf("&reseller_filter=%s", $record->reseller);
}
$_record_url = $this->url.sprintf(
"&service=%s@%s&zone_filter=%s&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($this->SoapEngine->soapEngine),
urlencode($record->zone),
urlencode($record->id)
);
if ($this->adminonly) $_record_url.= sprintf ("&reseller_filter=%s",$record->reseller);
if ($record->owner) {
$_owner_url = sprintf(
"%s",
$this->url,
urlencode($this->SoapEngine->soapEngine),
urlencode($record->owner),
$record->owner
);
} else {
$_owner_url='';
}
if ($this->fancy) {
printf(
"
%s |
%s.%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$record->customer,
$record->reseller,
$_zone_url,
$record->zone,
$_record_url,
$record->id,
$record->name,
$record->type,
$record->value,
$record->owner,
$record->changeDate,
$_url,
$actionText
);
} else {
printf("
%s |
%s.%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$record->customer,
$record->reseller,
$_zone_url,
$record->zone,
$_record_url,
$record->id,
$record->name,
$record->type,
$record->priority,
$record->value,
$record->ttl,
$record->changeDate,
$_url,
$actionText
);
}
$i++;
}
}
print " ";
if ($this->rows == 1 ) {
$this->showRecord($record);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showSeachFormCustom() {
printf(
"
Record Id
",
$this->filters['id']
);
printf(
"
Name
",
$this->filters['name']
);
if (count($this->allowedDomains) > 0) {
$selected_zone[$this->filters['zone']]='selected';
print "";
} else {
printf(
"
DNS zone
",
$this->filters['zone']
);
}
if ($this->typeFilter) {
printf(
" Type %s",
$this->typeFilter,
$this->typeFilter
);
} else {
$selected_type[$this->filters['type']]='selected';
echo "
";
}
printf(
"
Value
",
$this->filters['value']
);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id=$dictionary['id'];
} else {
$id=$this->filters['id'];
}
if (!$id) {
print " Missing record id. ";
return false;
}
$function = array(
'commit' => array(
'name' => $this->deleteRecordFunction,
'parameters' => array($id),
'logs' => array('success' => sprintf('DNS record %s has been deleted',$id))
)
);
$zone=$this->filters['zone'];
unset($this->filters);
$this->filters['zone']=$zone;
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showAddForm() {
/*
if ($this->adminonly) {
if (!$this->filters['reseller']) {
print " To add a new record you must search first for a customer";
return;
}
}
*/
printf("
";
}
function getAllowedDomains() {
// Filter
$filter = array(
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => $this->max_zones_selection
);
// Order
$orderBy = array(
'attribute' => 'name',
'direction' => 'ASC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->total > $this->max_zones_selection) return false;
foreach($result->zones as $zone) {
if (in_array($zone->name,$this->allowedDomains)) continue;
$this->allowedDomains[]=$zone->name;
$seen[$zone->name]++;
}
}
}
function addRecord($dictionary=array()) {
if ($this->typeFilter) {
$type = $this->typeFilter;
} else if ($dictionary['type']) {
$type = $dictionary['type'];
} else {
$type = trim($_REQUEST['type']);
}
if ($dictionary['name']) {
$name = $dictionary['name'];
} else {
$name = trim($_REQUEST['name']);
}
$name = rtrim($name,".");
if (preg_match("/^(.+)@(.*)$/", $name, $m)) {
$zone = $m[2];
} else {
if ($dictionary['zone']) {
$zone=$dictionary['zone'];
$this->skipSaveProperties=true;
} else if ($_REQUEST['zone']) {
$zone=$_REQUEST['zone'];
}
if ($type == 'MBOXFW') {
$name .= '@'.$zone;
}
}
if (!strlen($zone)) {
if ($this->html) {
echo "Error: Missing zone name. ";
}
return false;
}
$this->filters['zone']=$zone;
if (!strlen($type)) {
if ($this->html) {
echo "Error: Missing record type. ";
}
return false;
}
if ($dictionary['value']) {
$value = $dictionary['value'];
} else {
$value = trim($_REQUEST['value']);
}
$value=rtrim($value,".");
if ($this->adminonly) {
if ($dictionary['reseller']) {
} else if ($this->filters['reseller']) {
} else {
if ($this->html) {
echo "Error: Missing reseller, please first search zones for a given reseller ";
}
return false;
}
}
if ($dictionary['ttl']) {
$ttl = intval($dictionary['ttl']);
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if (!$ttl) $ttl=3600;
if ($dictionary['owner']) {
$owner = intval($dictionary['owner']);
} else {
$owner = intval(trim($_REQUEST['owner']));
}
if ($dictionary['priority']) {
$priority = $dictionary['priority'];
} else {
$priority = trim($_REQUEST['priority']);
}
if (in_array($type,array_keys($this->recordTypes))) {
// See RFC 1912 - Section 2.4
if (trim($name).trim($zone) == trim($zone) && $type == 'CNAME') {
printf(
"Error: CNAME (%s) equal to zone name (%s) is not allowed ",
trim($name).trim($zone),
trim($zone)
);
return false;
}
if (!strlen($value)) {
if ($this->html) {
echo "Error: Missing record value. ";
}
return false;
}
$record = array(
'name' => trim($name),
'zone' => trim($zone),
'type' => $type,
'value' => trim($value),
'owner' => intval($owner),
'ttl' => intval($ttl),
'priority' => intval($priority)
);
if (!$this->skipSaveProperties=true) {
$_p = array(
array(
'name' => 'dns_records_last_zone',
'category' => 'web',
'value' => $_REQUEST['zone'],
'permission' => 'customer'
),
array(
'name' => 'dns_records_last_type',
'category' => 'web',
'value' => "$type",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$function = array(
'commit' => array(
'name' => $this->addRecordFunction,
'parameters' => array($record),
'logs' => array('success' => sprintf('DNS record %s under %s has been added',$name,$zone))
)
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($this->html) {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
}
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
} else if (in_array($type,array_keys($this->recordTypesTemplate))) {
+ $push_notifications_server = $this->getResellerProperty('push_notifications_server_private') or $this->getResellerProperty('push_notifications_server');
+ if ($type == "sip2sip" && $push_notifications_server) {
+ if (preg_match("/^(.*):(\d+);transport=(.*)$/", $push_notifications_server, $m)) {
+ $push_hostname = $m[1];
+ $push_port = $m[2];
+ $push_transport = $m[3];
+ if ($push_transport == "tls") {
+ $naptr_type = "_sips._tcp";
+ $naptr_s = "SIPS+D2T";
+ } else if ($push_transport == "tcp") {
+ $naptr_type = "_sip._tcp";
+ $naptr_s = "SIP+D2T";
+ } else {
+ $naptr_type = "_sip._udp";
+ $naptr_s = "SIP+D2U";
+ }
+
+ $this->recordTypesTemplate[$type]['records']['push_naptr'] =
+ array(
+ 'name' => 'push',
+ 'type' => 'NAPTR',
+ 'priority' => '100',
+ 'ttl' => '600',
+ 'value' => sprintf('10 100 "s" "%s" "" %s.push', $naptr_s, $naptr_type)
+ );
+ $this->recordTypesTemplate[$type]['records']['push_srv'] =
+ array(
+ 'name' => sprintf('%s.push', $naptr_type),
+ 'type' => 'SRV',
+ 'priority' => '100',
+ 'ttl' => '600',
+ 'value' => sprintf('100 %d %s', $push_port, $push_hostname)
+ );
+ }
+ }
+
foreach (array_values($this->recordTypesTemplate[$type]['records']) as $_records) {
$value_new='';
if (strlen($_records['value'])) {
if (preg_match("/^_sip/",$_records['name'])) {
if (!$value) {
$value=$this->getCustomerProperty('dns_records_last_sip_server');
if (!$value) {
$value = $this->getCustomerProperty('sip_proxy');
}
if (!value) {
$value = $this->SoapEngine->default_sip_proxy;
}
$save_new_value=false;
} else {
$save_new_value=true;
}
}
$els=explode("|",$_records['value']);
foreach ($els as $el) {
if (preg_match("/#VALUE#/",$el)) {
if ($value) {
$value_new=preg_replace("/#VALUE#/",$value,$el);
} else {
continue;
}
} else {
$value_new=$el;
}
break;
}
// save value if type sip server
if ($save_new_value && $_records['name'] && preg_match("/^_sip/",$_records['name'])) {
$_p = array(
array(
'name' => 'dns_records_last_sip_server',
'category' => 'web',
'value' => $value,
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
}
if (!in_array($_records['type'],array_keys($this->recordTypes))) {
continue;
}
$record = array(
'name' => $_records['name'],
'zone' => trim($zone),
'type' => $_records['type'],
'value' => $value_new,
'owner' => intval($owner),
'ttl' => intval($_records['ttl']),
'priority' => intval($_records['priority'])
);
//print_r($record);
$function=array(
'commit' => array(
'name' => $this->addRecordFunction,
'parameters' => array($record),
'logs' => array(
'success' => sprintf('Dns %s record under %s has been added', $_records['type'], $zone)
)
)
);
$result = $this->SoapEngine->execute($function,$this->html);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($this->html) {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
}
syslog(LOG_NOTICE, $log);
return false;
}
}
} else {
if ($this->html) {
printf ("Error: Invalid or missing record type. ");
}
return false;
}
return true;
}
function getRecordKeys() {
// Filter
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->filters['type'],
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => 1000
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecords');
// Call function
$result = $this->SoapEngine->soapclient->getRecords($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->records as $record) {
$this->selectionKeys[]=array('id' => $record->id);
}
return true;
}
}
function showRecord($record) {
echo "Record";
printf("";
}
function getRecord($id) {
// Filter
if (!$id) {
print "Error in getRecord(): Missing record id";
return false;
}
$filter = array('id' => $id);
// Range
$range = array(
'start' => 0,
'count' => 1
);
// Order
$orderBy = array(
'attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action($this->getRecordsFunction);
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,$this->getRecordsFunction),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
if ($result->records[0]){
return $result->records[0];
} else {
return false;
}
}
}
function updateRecord () {
//print "Updating record ...";
if (!$_REQUEST['id_filter']) return;
if (!$record = $this->getRecord(intval($_REQUEST['id_filter']))) {
return false;
}
$record_old=$record;
foreach (array_keys($this->Fields) as $item) {
$var_name=$item.'_form';
//printf (" %s=%s",$var_name,$_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$record->$item = intval($_REQUEST[$var_name]);
} else {
$record->$item = trim($_REQUEST[$var_name]);
}
}
$function=array('commit' => array('name' => $this->updateRecordFunction,
'parameters' => array($record),
'logs' => array('success' => sprintf('Record %s has been updated',$_REQUEST['id_filter'])))
);
$result = $this->SoapEngine->execute($function,$this->html);
dprint_r($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
return false;
} else {
return true;
}
}
function showTextBeforeCustomerSelection() {
print _("Zone owner");
}
}
class FancyRecords extends DnsRecords {
var $fancy = true;
var $addRecordFunction = 'addFancyRecord';
var $deleteRecordFunction = 'deleteFancyRecord';
var $updateRecordFunction = 'updateFancyRecord';
var $getRecordsFunction = 'getFancyRecords';
var $getRecordFunction = 'getFancyRecord';
var $recordTypesTemplate=array();
var $Fields=array(
'type' => array('type'=>'string'),
'value' => array('type'=>'string')
);
}
class EmailAliases extends FancyRecords {
var $recordTypes=array('MBOXFW' => 'Email alias');
var $typeFilter='MBOXFW';
}
class UrlRedirect extends FancyRecords {
var $recordTypes=array('URL' => 'URL forwarding');
var $typeFilter='URL';
}
class TrustedPeers extends Records {
function TrustedPeers($SoapEngine) {
$this->filters = array('ip' => trim($_REQUEST['ip_filter']),
'description' => trim($_REQUEST['description_filter'])
);
$this->Records($SoapEngine);
$this->sortElements=array(
'changeDate' => 'Change date',
'description' => 'Description',
'ip' => 'IP address'
);
}
function listRecords() {
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array('ip' => $this->filters['ip'],
'description' => $this->filters['description']
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'description';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'ASC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getTrustedPeers');
$result = $this->SoapEngine->soapclient->getTrustedPeers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
Id
| Owner |
IP address |
Protocol |
Description |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->peers[$i]) break;
$peer = $result->peers[$i];
$index=$this->next+$i+1;
$_url = $this->url.sprintf("&service=%s&action=Delete&ip_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($peer->ip)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['ip_filter'] == $peer->ip) {
$_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($peer->reseller)
);
printf("
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$peer->reseller,
$peer->ip,
$peer->protocol,
$peer->description,
$peer->changeDate,
$_url,
$actionText
);
$i++;
}
}
print " ";
$this->showPagination($maxrows);
return true;
}
}
function showAddForm() {
//if ($this->selectionActive) return;
printf ("
|
";
}
function addRecord($dictionary=array()) {
if ($dictionary['ipaddress']) {
$ipaddress = $dictionary['ipaddress'];
} else {
$ipaddress = trim($_REQUEST['ipaddress']);
}
if ($dictionary['description']) {
$description = $dictionary['description'];
} else {
$description = trim($_REQUEST['description']);
}
if ($dictionary['owner']) {
$owner = $dictionary['owner'];
} else {
$owner = trim($_REQUEST['owner']);
}
list($customer,$reseller)=$this->customerFromLogin($dictionary);
if (!strlen($ipaddress) || !strlen($description)) {
printf ("Error: Missing IP or description. ");
return false;
}
$peer=array(
'ip' => $ipaddress,
'description' => $description,
'owner' => intval($_REQUEST['owner']),
'customer' => intval($customer),
'reseller' => intval($reseller)
);
$function=array('commit' => array('name' => 'addTrustedPeer',
'parameters' => array($peer),
'logs' => array('success' => sprintf('Trusted peer %s has been added',$ipaddress)))
);
return $this->SoapEngine->execute($function,$this->html);
}
function deleteRecord($dictionary=array()) {
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print " Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['ip'])) {
print " Error: missing IP address. ";
return false;
}
$function=array('commit' => array('name' => 'deleteTrustedPeer',
'parameters' => array($this->filters['ip']),
'logs' => array('success' => sprintf('Trusted peer %s has been deleted',$this->filters['ip'])))
);
unset($this->filters);
return $this->SoapEngine->execute($function,$this->html);
}
function showSeachFormCustom() {
printf (" IP address ",$this->filters['ip']);
printf (" Description ",$this->filters['description']);
}
function showCustomerTextBox () {
print "Owner";
$this->showResellerForm('reseller');
print " ";
}
function showTextBeforeCustomerSelection() {
print "Owner";
}
function showCustomerForm($name='customer_filter') {
}
}
class Carriers extends Records {
var $carriers=array();
var $Fields=array(
'id' => array('type'=>'integer',
'readonly' => true),
'name' => array('type'=>'string')
);
var $sortElements=array(
'changeDate' => 'Change date',
'name' => 'Carrier'
);
function Carriers($SoapEngine) {
$this->filters = array('id' => trim($_REQUEST['id_filter']),
'name' => trim($_REQUEST['name_filter'])
);
$this->Records($SoapEngine);
}
function showCustomerTextBox () {
print "Reseller";
print "";
$this->showResellerForm('reseller');
print "";
}
function listRecords() {
$this->showSeachForm();
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Filter
$filter=array(
'id' => intval($this->filters['id']),
'name' => $this->filters['name'],
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$this->log_action('getCarriers');
$result = $this->SoapEngine->soapclient->getCarriers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$this->rows = $result->total;
print "
$this->rows records found
";
print "
Id |
Owner |
Carrier |
Name |
Gateways |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->carriers[$i]) break;
$carrier = $result->carriers[$i];
$index=$this->next+$i+1;
$_delete_url = $this->url.sprintf("&service=%s&action=Delete&id_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($carrier->id)
);
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['id_filter'] == $carrier->id) {
$_delete_url .= "&confirm=1";
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
$_url = $this->url.sprintf("&service=%s&id_filter=%s&reseller_filter=%s",
urlencode($this->SoapEngine->service),
urlencode($carrier->id),
urlencode($carrier->reseller)
);
$_customer_url = $this->url.sprintf("&service=customers@%s&customer_filter=%s",
urlencode($this->SoapEngine->customer_engine),
urlencode($carrier->reseller)
);
$_gateway_url = $this->url.sprintf("&service=pstn_gateways@%s&carrier_id_filter=%d&reseller_filter=%s",
urlencode($this->SoapEngine->soapEngine),
urlencode($carrier->id),
urlencode($carrier->reseller)
);
printf("
%s |
%s |
%s |
%s |
Gateways |
%s |
%s |
",
$index,
$_customer_url,
$carrier->reseller,
$_url,
$carrier->id,
$carrier->name,
$_gateway_url,
$carrier->changeDate,
$_delete_url,
$actionText
);
printf("
");
$i++;
}
}
print " ";
if ($this->rows == 1) {
$this->showRecord($carrier);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showAddForm() {
//if ($this->selectionActive) return;
printf (" |
",
$_REQUEST[confirm_password_form]
);
}
}
}
}
if ($_REQUEST['notify']) $checked_notify='checked';
printf ("
",$checked_notify);
$this->printHiddenFormElements();
print " | ";
print "
";
}
function addRecord($dictionary=array(),$confirmPassword=false) {
if (!$this->checkRecord($dictionary)) {
return false;
}
foreach (array_keys($this->addFields) as $item) {
if ($dictionary[$item]) {
$customer[$item] = strip_tags(trim($dictionary[$item]));
} else {
$item_form = $item.'_form';
$customer[$item] = strip_tags(trim($_REQUEST[$item_form]));
}
}
if (!strlen($customer['username'])) $customer['username'] = trim($customer['firstName']).'.'.trim($customer['lastName'].$this->RandomNumber(5));
if (!strlen($customer['state'])) $customer['state'] = 'N/A';
if (!strlen($customer['country'])) $customer['country'] = 'N/A';
if (!strlen($customer['city'])) $customer['city'] = 'Unknown';
if (!strlen($customer['address'])) $customer['address'] = 'Unknown';
if (!strlen($customer['postcode'])) $customer['postcode'] = 'Unknown';
if (!strlen($customer['timezone'])) $customer['timezone'] = 'Europe/Amsterdam';
if ($dictionary['reseller']) {
$customer['reseller']=intval($dictionary['reseller']);
} else if ($this->adminonly && $this->filters['reseller']) {
$customer['reseller']=intval($this->filters['reseller']);
}
$customer['username'] = strtolower(preg_replace ("/\s+/",".",trim($customer['username'])));
$customer['username'] = preg_replace ("/\.{2,}/",".",$customer['username']);
if ($customer['state'] != 'N/A') {
$_state=$customer['state'].' ';
} else {
$_state='';
}
if (!strlen($customer['tel'])){
$customer['tel'] = '+19999999999';
} else {
$customer['tel'] = preg_replace("/[^0-9\+]/","",$customer['tel']);
if (preg_match("/^00(\d{1,20})$/",$customer['tel'],$m)) {
$customer['tel'] = "+".$m[1];
}
}
$customer['billingEmail'] = $customer['email'];
if ($customer['address'] != 'Unknown') {
$customer['billingAddress'] = $customer['address']."\n".
$customer['postcode']." ".$customer['city']."\n".
$_state.$customer['country']."\n";
}
if ($confirmPassword) {
if (!strlen($customer['password'])) {
$this->errorMessage='Password cannot be empty';
return false;
} else if ($customer['password'] != $_REQUEST['confirm_password_form']) {
$this->errorMessage='Password is not confirmed';
return false;
}
}
if (!strlen($customer['password'])) $customer['password'] = $this->RandomString(6);
if (is_array($dictionary['properties'])) {
$customer['properties']=$dictionary['properties'];
} else {
$customer['properties']=array();
}
if ($this->hide_html) {
$logs = array();
} else {
$logs = array('success' => sprintf('Customer entry %s %s has been created',$customer['firstName'],$customer['lastName']));
}
$function=array('commit' => array('name' => 'addAccount',
'parameters' => array($customer),
'logs' => $logs
)
);
if ($result = $this->SoapEngine->execute($function,$this->html)) {
// We have succesfully added customer entry
$this->showAddForm=false;
if ($dictionary['notify'] || $_REQUEST['notify']) $this->notify($customer);
return $result;
} else {
return false;
}
}
function notify($customer) {
/*
must be supplied with an array:
$customer=array('firstName' => ''
'lastName' => '',
'email' => '',
'username' => '',
'password' => ''
);
*/
if ($this->support_web) {
$url=$this->support_web;
} else {
if ($_SERVER['HTTPS']=="on") {
$protocolURL="https://";
} else {
$protocolURL="http://";
}
$url=sprintf("%s%s",$protocolURL,$_SERVER['HTTP_HOST']);
}
$body=
sprintf("Dear %s,\n\n",$customer['firstName']).
sprintf("This e-mail message is for your record. You have registered a login account at %s as follows:\n\n",$url).
sprintf("Username: %s\n",$customer['username']).
sprintf("Password: %s\n",$customer['password']).
"\n".
sprintf("The registration has been performed from the IP address %s.",$_SERVER['REMOTE_ADDR']).
"\n".
"\n".
sprintf("This message was sent in clear text over the Internet and it is advisable, in order to protect your account, to login and change your password displayed in this message. ").
"\n".
"\n".
"This is an automatic message, do not reply.\n";
$from = sprintf("From: %s",$this->support_email);
$subject = sprintf("Your account at %s",$url);
return mail($customer['email'], $subject, $body, $from);
}
function getRecordKeys() {
// Filter
$filter=array('username' => $this->filters['username'],
'firstName' => $this->filters['firstName'],
'lastName' => $this->filters['lastName'],
'organization' => $this->filters['organization'],
'tel' => $this->filters['tel'],
'email' => $this->filters['email'],
'web' => $this->filters['web'],
'city' => $this->filters['city'],
'country' => $this->filters['country'],
'only_resellers' => $this->filters['only_resellers'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range=array('start' => 0,
'count' => 1000
);
// Order
$orderBy = array('attribute' => 'customer',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
if ($this->adminonly && $this->filters['only_resellers']) {
$this->log_action('getResellers');
$result = $this->SoapEngine->soapclient->getResellers($Query);
} else {
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
}
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
foreach ($result->accounts as $customer) {
$this->selectionKeys[]=$customer->id;
}
}
}
function getProperty($customer,$name) {
foreach ($customer->properties as $_property) {
if ($_property->name == $name) {
return $_property->value;
}
}
return false;
}
function getCustomerId($username) {
if (!strlen($username)) return false;
$filter = array('username' => $username);
$range = array('start' => 0,'count' => 1);
$orderBy = array('attribute' => 'customer', 'direction' => 'ASC');
$Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if (count($result->accounts) == 1) {
return $result->accounts[0]->id;
} else {
return false;
}
}
}
function getCustomer($username) {
if (!strlen($username)) {
return false;
}
$filter = array('username' => $username);
$range = array('start' => 0,'count' => 1);
$orderBy = array('attribute' => 'customer', 'direction' => 'ASC');
$Query=array('filter' => $filter,'orderBy' => $orderBy,'range' => $range);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
// Call function
$this->log_action('getCustomers');
$result = $this->SoapEngine->soapclient->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if (count($result->accounts) == 1) {
return $result->accounts[0];
} else {
return false;
}
}
}
function setInitialCredits($credits=array()) {
$properties=array();
foreach (array_keys($credits) as $item) {
if ($this->allProperties[$item]['category'] != 'credit') continue;
$properties[] = array('name' => $item,
'value' => "$credits[$item]",
'category' => $this->allProperties[$item]['category'],
'permission' => $this->allProperties[$item]['permission']
);
}
return $properties;
}
function showVcard($vcardDictionary) {
#http://www.stab.nu/vcard/
# This file will return an vCard Version 3.0 Compliant file to the user. Observe that you should set up #
# your web-server with the correct MIME-type. The reason to use the \r\n as breakes is because it should be #
# more compatible with MS Outlook. All other, better coded, clients sholdnt have any problems with this. #
# #
# Version 1.0 (2003-08-29) #
# #
# Author: Alf Lovbo #
# #
# This document is released under the GNU General Public License. #
# #
#############################################################################################################
# #
# USAGE #
# ----- #
# The following variables can be used togheter with this document for accessing the functions supplied. All #
# of the functions listed below takes an value described by the comment after the |-symbol. #
# #
# $vcard_birtda | Birthday YYYY-MM-DD $vcard_f_name | Family name #
# $vcard_cellul | Cellular Phone Number $vcard_compan | Company Name #
# $vcard_h_addr | Street Address (home) $vcard_h_city | City (home) #
# $vcard_h_coun | Country (home) $vcard_h_fax | Fax (home) #
# $vcard_h_mail | E-mail (home) $vcard_h_phon | Phone (home) #
# $vcard_h_zip | Zip-code (home) $vcard_nickna | Nickname #
# $vcard_note | Note $vcard_s_name | Given name #
# $vcard_uri | Homepage, URL $vcard_w_addr | Street Address (work) #
# $vcard_w_city | City (work) $vcard_w_coun | Country (work) #
# $vcard_w_fax | Fax (work) $vcard_w_mail | E-mail (work) #
# $vcard_w_phon | Phone (work) $vcard_w_role | Function (work) #
# $vcard_w_titl | Title (work) $vcard_w_zip | Zip-code (work) #
# #
#############################################################################################################
# You dont need to change anything below this comment. #
#############################################################################################################
/*
$vcardDictionary=array(
"vcard_nickna" => $this->username,
"vcard_f_name" => $this->lastname,
"vcard_s_name" => $this->firstname,
"vcard_compan" => $this->organization,
"vcard_w_addr" => $this->address,
"vcard_w_zip" => $this->postcode,
"vcard_w_city" => $this->city,
"vcard_w_state" => $this->county,
"vcard_w_coun" => $this->country,
"vcard_w_mail" => $this->email,
"vcard_w_phon" => $this->tel,
"vcard_w_fax" => $this->fax,
"vcard_enum" => $this->enum,
"vcard_sip" => $this->sip,
"vcard_uri" => $this->web,
"vcard_cellul" => $this->mobile
);
*/
foreach (array_keys($vcardDictionary) as $field) {
$value=$vcardDictionary[$field];
${$field}=$value;
}
if ($vcard_w_state=="N/A") $vcard_w_state=" ";
$vcard_w_addr = preg_replace("/[\n|\r]/"," ",$vcard_w_addr);
$vcard_sortst = $vcard_f_name;
$vcard_tz = date("O");
$vcard_rev = date("Y-m-d");
$vcard = "BEGIN:VCARD\r\n";
$vcard .= "VERSION:3.0\r\n";
$vcard .= "CLASS:PUBLIC\r\n";
$vcard .= "PRODID:-//PHP vCard Class//NONSGML Version 1//SE\r\n";
$vcard .= "REV:" . $vcard_rev . "\r\n";
$vcard .= "TZ:" . $vcard_tz . "\r\n";
if ($vcard_f_name != ""){
if ($vcard_s_name != ""){
$vcard .= "FN:" . $vcard_s_name . " " . $vcard_f_name . "\r\n";
$vcard .= "N:" . $vcard_f_name . ";" . $vcard_s_name . "\r\n";
}
else {
$vcard .= "FN:" . $vcard_f_name . "\r\n";
$vcard .= "N:" . $vcard_f_name . "\r\n";
}
}
elseif ($vcard_s_name != ""){
$vcard .= "FN:" . $vcard_s_name . "\r\n";
$vcard .= "N:" . $vcard_s_name . "\r\n";
}
if ($vcard_nickna != ""){
$vcard .= "NICKNAME:" . $vcard_nickna . "\r\n";
}
if ($vcard_compan != ""){
$vcard .= "ORG:" . $vcard_compan . "\r\n";
$vcard .= "SORTSTRING:" . $vcard_compan . "\r\n";
}
elseif ($vcard_f_name != ""){
$vcard .= "SORTSTRING:" . $vcard_f_name . "\r\n";
}
if ($vcard_birtda != ""){
$vcard .= "BDAY:" . $vcard_birtda . "\r\n";
}
if ($vcard_w_role != ""){
$vcard .= "ROLE:" . $vcard_w_role . "\r\n";
}
if ($vcard_w_titl != ""){
$vcard .= "TITLE:" . $vcard_w_titl . "\r\n";
}
if ($vcard_note != ""){
$vcard .= "NOTE:" . $vcard_note . "\r\n";
}
if ($vcard_w_mail != ""){
$item++;
$vcard .= "item$item.EMAIL;TYPE=INTERNET;type=PREF:" . $vcard_w_mail . "\r\n";
$vcard .= "item$item.X-ABLabel:email" . "\r\n";
}
if ($vcard_cellul != ""){
$vcard .= "TEL;TYPE=VOICE,CELL:" . $vcard_cellul . "\r\n";
}
if ($vcard_enum != ""){
$item++;
$vcard .= "item$item.TEL:" . $vcard_enum . "\r\n";
$vcard .= "item$item.X-ABLabel:ENUM" . "\r\n";
}
if ($vcard_sip != ""){
$item++;
$vcard .= "item$item.TEL;TYPE=INTERNET:" . $vcard_sip . "\r\n";
$vcard .= "item$item.X-ABLabel:SIP" . "\r\n";
}
if ($vcard_w_fax != ""){
$vcard .= "TEL;TYPE=FAX,WORK:" . $vcard_w_fax . "\r\n";
}
if ($vcard_w_phon != ""){
$vcard .= "TEL;TYPE=VOICE,WORK:" . $vcard_w_phon . "\r\n";
}
if ($vcard_uri != ""){
$vcard .= "URL:" . $vcard_uri . "\r\n";
}
if ($vcard_addr != ""){
$vcard .= "ADR;TYPE=HOME,POSTAL,PARCEL:" . $vcard_addr . "\r\n";
}
if ($vcard_labl != ""){
$vcard .= "LABEL;TYPE=DOM,HOME,POSTAL,PARCEL:" . $vcard_labl . "\r\n";
}
$vcard_addr = "";
$vcard_labl = "";
if ($vcard_w_addr != ""){
$vcard_addr = ";;" . $vcard_w_addr;
$vcard_labl = $vcard_w_addr;
}
if ($vcard_w_city != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_city;
}
else{
$vcard_addr .= ";;;" . $vcard_w_city;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_city;
}
else {
$vcard_labl = $vcard_w_city;
}
}
if ($vcard_w_state != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_state;
}
else{
$vcard_addr .= ";;;" . $vcard_w_state;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_state;
}
else {
$vcard_labl = $vcard_w_state;
}
}
if ($vcard_w_zip != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_zip;
}
else{
$vcard_addr .= ";;;;" . $vcard_w_zip;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_zip;
}
else {
$vcard_labl = $vcard_w_zip;
}
}
if ($vcard_w_coun != ""){
if ($vcard_addr != ""){
$vcard_addr .= ";" . $vcard_w_coun;
}
else{
$vcard_addr .= ";;;;;" . $vcard_w_coun;
}
if ($vcard_labl != ""){
$vcard_labl .= "\\r\\n" . $vcard_w_coun;
}
else {
$vcard_labl = $vcard_w_coun;
}
}
if ($vcard_addr != ""){
$vcard .= "ADR;TYPE=WORK,POSTAL,PARCEL:" . $vcard_addr . "\r\n";
}
if ($vcard_labl != ""){
$vcard .= "LABEL;TYPE=DOM,WORK,POSTAL,PARCEL:" . $vcard_labl . "\r\n";
}
if ($vcard_categ != ""){
$vcard .= "CATEGORY:" . $vcard_categ . "\r\n";
}
$vcard .= "END:VCARD\n";
return $vcard;
}
}
class Presence {
function Presence($SoapEngine) {
$this->SoapEngine = $SoapEngine;
}
function publishPresence ($soapEngine,$SIPaccount=array(),$note='None',$activity='idle') {
if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) {
print "Error: soapEngine '$soapEngine' does not exist.\n";
return false;
}
if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) {
print "Error: SIP account not defined\n";
return false;
}
$this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url'];
$this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$allowed_activities=array('open',
'idle',
'busy',
'available'
);
if (in_array($activity,$allowed_activities)) {
$presentity['activity'] = $activity;
} else {
$presentity['activity'] = 'open';
}
$presentity['note'] = $note;
$result = $this->PresencePort->setPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password'], $presentity);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
return true;
}
function getPresenceInformation ($soapEngine,$SIPaccount) {
if (!in_array($soapEngine,array_keys($this->SoapEngine->soapEngines))) {
print "Error: soapEngine '$soapEngine' does not exist.\n";
return false;
}
if (!$SIPaccount['username'] || !$SIPaccount['domain'] || !$SIPaccount['password'] ) {
print "Error: SIP account not defined";
return false;
}
$this->SOAPurl = $this->SoapEngine->soapEngines[$soapEngine]['url'];
$this->PresencePort = new WebService_SoapSIMPLEProxy_PresencePort($this->SOAPurl);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->PresencePort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$result = $this->PresencePort->getPresenceInformation(array("username" =>$SIPaccount['username'],"domain" =>$SIPaccount['domain']),$SIPaccount['password']);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
return $result;
}
}
}
class recordGenerator extends SoapEngine {
//this class generates in bulk enum numbers and sip accounts
var $template = array();
var $allowedPorts = array();
var $maxRecords = 500;
var $minimum_number_length = 4;
var $maximum_number_length = 15;
var $default_ip_access_list = '';
var $default_call_limit = '';
function recordGenerator($generatorId,$record_generators,$soapEngines,$login_credentials=array()) {
$this->record_generators = $record_generators;
$this->generatorId = $generatorId;
$this->login_credentials = $login_credentials;
//dprint_r($this->login_credentials);
$keys = array_keys($this->record_generators);
if (!$generatorId) $generatorId=$keys[0];
if (!in_array($generatorId,array_keys($this->record_generators))) {
return false;
}
if (strlen($this->login_credentials['soap_filter'])) {
$this->soapEngines = $this->getSoapEngineAllowed($soapEngines,$this->login_credentials['soap_filter']);
} else {
$this->soapEngines = $soapEngines;
}
if (in_array($this->record_generators[$generatorId]['sip_engine'],array_keys($this->soapEngines))) {
// sip zones
if (count($this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']]) > 1 && !in_array('sip_accounts',$this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']])) {
// sip port not available
dprint("sip port not avaliable");
} else {
$sip_engine = 'sip_accounts@'.$this->record_generators[$generatorId]['sip_engine'];
$this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials);
$_sip_class = $this->SipSoapEngine->records_class;
$this->sipRecords = new $_sip_class($this->SipSoapEngine);
$this->sipRecords->getAllowedDomains();
print_r($this->record_generators[$generatorId]['sip_engine']);
if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']){
$this->default_ip_access_list = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list'];
}
if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']){
$this->default_call_limit = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit'];
}
}
} else {
printf ("Error: sip_engine %s does not exist",$this->record_generators[$generatorId]['sip_engine']);
}
if (in_array($this->record_generators[$generatorId]['enum_engine'],array_keys($this->soapEngines))) {
if (count($this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']]) > 1 && !in_array('enum_numbers',$this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']])) {
dprint("enum port not avaliable");
// enum port not available
} else {
// enum mappings
$enum_engine = 'enum_numbers@'.$this->record_generators[$generatorId]['enum_engine'];
$this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials);
$_enum_class = $this->EnumSoapEngine->records_class;
$this->enumRecords = new $_enum_class($this->EnumSoapEngine);
}
} else {
printf ("Error: enum_engine %s does not exist",$this->record_generators[$generatorId]['enum_engine']);
}
if (in_array($this->record_generators[$generatorId]['customer_engine'],array_keys($this->soapEngines))) {
if (count($this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']]) > 1 && !in_array('customers',$this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']])) {
dprint("customer port not avaliable");
} else {
$customer_engine = 'customers@'.$this->record_generators[$generatorId]['customer_engine'];
$this->CustomerSoapEngine = new SoapEngine($customer_engine,$soapEngines,$login_credentials);
$_customer_class = $this->CustomerSoapEngine->records_class;
$this->customerRecords = new $_customer_class($this->CustomerSoapEngine);
}
} else {
printf ("Error: customer_engine %s does not exist",$this->record_generators[$generatorId]['customer_engine']);
}
if ($_REQUEST['reseller_filter']) $this->template['reseller']=intval($_REQUEST['reseller_filter']);
if ($_REQUEST['customer_filter']) $this->template['customer']=intval($_REQUEST['customer_filter']);
}
function showGeneratorForm() {
print "
";
print _("ENUM number generator");
print "
|
|
|
";
print "
";
print _("ENUM range");
print "
| ";
/*
if ($_REQUEST['range']) {
$selected_range[$_REQUEST['range']]='selected';
} else if ($_last_range=$this->enumRecords->getCustomerProperty('enum_generator_range')) {
$selected_range[$_last_range] = 'selected';
}
if (is_array($this->enumRecords->ranges)) {
print "";
}
*/
list($_range['prefix'],$_range['tld'])=explode("@",$_REQUEST['range']);
printf ("+%s under %s",$_REQUEST['range'],$_range['prefix'],$_range['tld']);
print " |
|
";
print "
";
print "";
print _("ENUM mapping template");
print "";
print " |
";
if ($_REQUEST['add_prefix']) {
$add_prefix=$_REQUEST['add_prefix'];
} else {
$add_prefix = $this->sipRecords->getCustomerProperty('enum_generator_add_prefix');
}
print "
";
print _("Add prefix after range:");
printf ("
|
|
|
",$add_prefix);
if ($_REQUEST['number_length']) {
$number_length=$_REQUEST['number_length'];
} else {
$number_length = $this->sipRecords->getCustomerProperty('enum_generator_number_length');
}
print "
";
print _("Number length:");
printf ("
|
|
",$number_length);
print _("SIP domain:");
print "
|
";
if (count($this->sipRecords->allowedDomains) > 0) {
if ($_REQUEST['domain']) {
$selected_domain[$_REQUEST['domain']]='selected';
} else if ($_last_domain=$this->sipRecords->getCustomerProperty('enum_generator_sip_domain')) {
$selected_domain[$_last_domain] = 'selected';
}
print "
";
} else {
print "";
}
print "
|
";
print "
|
";
if ($_REQUEST['strip_digits']) {
$strip_digits=$_REQUEST['strip_digits'];
} else if ($strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_strip_digits')) {
} else {
$strip_digits=0;
}
print "
";
print _("Strip digits:");
printf ("
|
|
",$strip_digits);
print "
";
print _("Owner:");
printf ("
|
| ",$_REQUEST['owner']);
print "
|
";
print "
";
print _("Info:");
printf ("
|
| ",$_REQUEST['info']);
print "
|
";
if (count($this->sipRecords->allowedDomains) > 0) {
print "
|
";
print "
";
print "";
print _("SIP account template");
print "";
print " |
";
print "
";
print _("Create SIP records");
if ($_REQUEST['create_sip']) {
$checked_create_sip='checked';
} else {
$checked_create_sip='';
}
printf ("
|
|
",$checked_create_sip);
if ($_REQUEST['pstn']) {
$checked_pstn='checked';
} else {
$checked_pstn='';
}
print "
";
print _("PSTN access");
printf ("
|
|
",$checked_pstn);
if ($_REQUEST['prepaid']) {
$checked_prepaid='checked';
} else {
$checked_prepaid='';
}
print "
";
print _("Prepaid");
printf ("
|
|
",$checked_prepaid);
if ($_REQUEST['rpid_strip_digits']) {
$rpid_strip_digits=$_REQUEST['rpid_strip_digits'];
} else if ($rpid_strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_rpid_strip_digits')) {
} else {
$rpid_strip_digits=0;
}
print "
";
print _("Strip digits from Caller-ID");
printf ("
|
|
",$rpid_strip_digits);
print "
";
print _("Quota");
printf ("
|
|
",$_REQUEST['quota']);
print "
";
print _("Password");
printf ("
|
|
",$_REQUEST['password']);
if (isset($_REQUEST['call_limit'])) {
$call_limit=$_REQUEST['call_limit'];
} else {
$call_limit = $this->sipRecords->getCustomerProperty('enum_generator_call_limit');
}
if (!strlen($call_limit) && strlen($this->default_call_limit)) {
$call_limit = $this->default_call_limit;
}
print "
";
print _("PSTN call limit");
printf ("
|
|
",$call_limit);
if (isset($_REQUEST['ip_access_list'])) {
$ip_access_list=$_REQUEST['ip_access_list'];
} else {
$ip_access_list = $this->sipRecords->getCustomerProperty('enum_generator_ip_access_list');
}
if (!$ip_access_list && $this->default_ip_access_list) {
$ip_access_list = $this->default_ip_access_list;
}
print "
";
print _("IP access list");
printf ("
|
|
",$ip_access_list);
}
if ($_REQUEST['nr_records']) {
$nr_records=$_REQUEST['nr_records'];
} else {
$nr_records=1;
}
print "
|
";
print "
";
print "";
print "";
printf (" |
Number of records:
",$nr_records);
print " | ";
print "
|
";
print "
";
print _("Existing records will not be overwritten. ");
print " |
";
$this->printHiddenFormElements();
print "
|
";
}
function checkGenerateRequest() {
// check number of records
$this->template['create_sip']=trim($_REQUEST['create_sip']);
$ip_access_list = preg_replace("/\s+/"," ", $_REQUEST['ip_access_list']);
if (strlen($ip_access_list) and !check_ip_access_list(trim($ip_access_list), true)) {
printf ("Error: IP access lists must be a space separated list of IP network/mask, example: 10.0.20.40/24");
return false;
}
$this->template['ip_access_list'] = trim($ip_access_list);
if (strlen($_REQUEST['call_limit']) && !is_numeric($_REQUEST['call_limit'])) {
printf ("Error: PSTN call limit must be numeric");
return false;
}
$this->template['call_limit']=$_REQUEST['call_limit'];
$this->template['rpid_strip_digits']=intval($_REQUEST['rpid_strip_digits']);
$this->template['info']=trim($_REQUEST['info']);
$nr_records=trim($_REQUEST['nr_records']);
if (!is_numeric($nr_records) || $nr_records < 1 || $nr_records > $this->maxRecords) {
printf ("Error: number of records must be a number between 1 and %d",$this->maxRecords);
return false;
}
$this->template['nr_records'] = $nr_records;
$number_length=trim($_REQUEST['number_length']);
if (!is_numeric($number_length) || $number_length < $this->minimum_number_length || $number_length > $this->maximum_number_length) {
printf ("Error: number length must be a number between 4 and 15",$this->minimum_number_length,$this->maximum_number_length);
return false;
}
$this->template['number_length'] = $number_length;
$strip_digits=trim($_REQUEST['strip_digits']);
if (!is_numeric($strip_digits) || $strip_digits < 0 || $number_length < $strip_digits + 3) {
printf ("Error: strip digits + 3 must be smaller then %d",$number_length);
return false;
}
$this->template['strip_digits'] = $strip_digits;
// sip domain
$domain=trim($_REQUEST['domain']);
if (!strlen($domain)) {
print "Error: SIP domain is missing";
return false;
}
$this->template['domain'] = $domain;
$add_prefix=trim($_REQUEST['add_prefix']);
if (strlen($add_prefix) && !is_numeric($add_prefix)) {
print "Error: Add prefix must be numeric";
return false;
}
$this->template['add_prefix'] = $add_prefix;
$owner=trim($_REQUEST['owner']);
if (strlen($owner) && !is_numeric($owner)) {
print "Error: Owner must be an integer";
return false;
}
// check ENUM TLD
list($rangePrefix,$tld)=explode('@',trim($_REQUEST['range']));
$this->template['range'] = trim($_REQUEST['range']);
$this->template['rangePrefix'] = $rangePrefix;
$this->template['tld'] = $tld;
$this->template['quota'] = intval($_REQUEST['quota']);
$this->template['owner'] = intval($owner);
$this->template['pstn'] = intval($_REQUEST['pstn']);
$this->template['prepaid'] = intval($_REQUEST['prepaid']);
$this->template['password'] = trim($_REQUEST['password']);
///////////////////////////////////////
// logical checks
if (strlen($this->template['add_prefix'])) {
$start = $this->template['add_prefix'];
} else {
$start = 0;
}
$this->template['digitsAfterRange'] = $this->template['number_length'] - strlen($this->template['rangePrefix']);
if ($this->template['number_length'] == strlen($this->template['rangePrefix']) + strlen($this->template['add_prefix'])) {
$this->template['firstNumber'] = $this->template['rangePrefix'].$this->template['add_prefix'];
$this->template['lastNumber'] = substr($this->template['firstNumber'],0,-1).'9';
$this->template['maxNumbers'] = $this->template['lastNumber'] - $this->template['firstNumber'] + 1;
} else {
$this->template['firstNumber'] = $this->template['rangePrefix'].str_pad($start,$this->template['digitsAfterRange'],'0');
$this->template['lastNumber'] = sprintf("%.0f", $this->template['firstNumber'] + pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])) - 1);
$this->template['maxNumbers'] = pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix']));
}
dprint_r($this->template);
if ($this->template['maxNumbers'] < $this->template['nr_records']) {
printf ("Error: Insufficient numbers in range, requested = %d, available = %d",$this->template['nr_records'],$this->template['maxNumbers']);
return false;
}
return true;
}
function generateRecords() {
print "";
if (!$this->checkGenerateRequest()) {
return false;
}
print " Generating records
";
$_p=array(
array('name' => 'enum_generator_sip_domain',
'category' => 'web',
'value' => strval($this->template['domain']),
'permission' => 'customer'
),
array('name' => 'enum_generator_range',
'category' => 'web',
'value' => strval($this->template['range']),
'permission' => 'customer'
),
array('name' => 'enum_generator_strip_digits',
'category' => 'web',
'value' => strval($this->template['strip_digits']),
'permission' => 'customer'
),
array('name' => 'enum_generator_number_length',
'category' => 'web',
'value' => strval($this->template['number_length']),
'permission' => 'customer'
),
array('name' => 'enum_generator_add_prefix',
'category' => 'web',
'value' => strval($this->template['add_prefix']),
'permission' => 'customer'
),
array('name' => 'enum_generator_rpid_strip_digits',
'category' => 'web',
'value' => strval($this->template['rpid_strip_digits']),
'permission' => 'customer'
),
array('name' => 'enum_generator_call_limit',
'category' => 'web',
'value' => strval($this->template['call_limit']),
'permission' => 'customer'
),
array('name' => 'enum_generator_ip_access_list',
'category' => 'web',
'value' => strval($this->template['ip_access_list']),
'permission' => 'customer'
)
);
$this->enumRecords->setCustomerProperties($_p);
if ($this->template['owner']) {
if ($customer = $this->customerRecords->getRecord($this->template['owner'])) {
$this->template['email'] = $customer->email;
$this->template['firstName'] = $customer->firstName;
$this->template['lastName'] = $customer->lastName;
if (!strlen($this->template['info'])) {
$this->template['info'] = $customer->firstName.' '.$customer->lastName;
}
} else {
printf ("Error: cannot retrieve customer information for owner %d",$this->template['owner']);
}
}
dprint_r($this->template);
$i=0;
while ($i < $this->template['nr_records']) {
$number = sprintf("%.0f", $this->template['firstNumber'] + $i);
$username = substr($number,$this->template['strip_digits']);
$mapto = 'sip:'.$username.'@'.$this->template['domain'];
print "- ";
printf ('Generating number +%s with mapping %s ',$number,$mapto);
flush();
$enumMapping = array('tld' => $this->template['tld'],
'number' => $number,
'type' => 'sip',
'mapto' => $mapto,
'info' => $this->template['info'],
'owner' => $this->template['owner']
);
if ($this->template['create_sip']) {
if (preg_match("/^0/",$username)) {
printf ('SIP accounts starting with 0 are not generated (%s@%s)',$username,$this->template['domain']);
continue;
}
$groups=array();
printf ('and sip account %s@%s ',$username,$this->template['domain']);
$ip_access_list = check_ip_access_list($this->template['ip_access_list']);
$sipAccount = array('account' => $username.'@'.$this->template['domain'],
'quota' => $this->template['quota'],
'prepaid' => $this->template['prepaid'],
'password' => $this->template['password'],
'groups' => $groups,
'owner' => $this->template['owner'],
'pstn' => $this->template['pstn'],
'ip_access_list' => $ip_access_list,
'call_limit' => $this->template['call_limit']
);
if ($this->template['firstName']) {
$sipAccount['fullname'] = $this->template['firstName'].' '.$this->template['lastName'];
}
if ($this->template['email']) {
$sipAccount['email'] = $this->template['email'];
}
if ($this->template['pstn']) {
$strip_rpid=intval($this->template['rpid_strip_digits']);
if ($strip_rpid && strlen($number) > $strip_rpid) {
$sipAccount['rpid']=substr($number,intval($this->template['rpid_strip_digits']));
} else {
$sipAccount['rpid']=$number;
}
}
} else {
unset($sipAccount);
}
dprint_r($sipAccount);
if (is_array($enumMapping)) $this->enumRecords->addRecord($enumMapping);
if (is_array($sipAccount)) $this->sipRecords->addRecord($sipAccount);
$i++;
}
print "
";
return true;
}
function printHiddenFormElements () {
printf("",$this->generatorId);
if ($this->adminonly) {
printf("",$this->adminonly);
}
if ($this->template['customer']) {
printf("",$this->template['customer']);
}
if ($this->template['reseller']) {
printf("",$this->template['reseller']);
}
foreach (array_keys($this->EnumSoapEngine->extraFormElements) as $element) {
if (!strlen($this->EnumSoapEngine->extraFormElements[$element])) continue;
printf ("\n",$element,$this->EnumSoapEngine->extraFormElements[$element]);
}
}
function getSoapEngineAllowed($soapEngines,$filter) {
// filter syntax:
// $filter="engine1:port1,port2,port3 engine2 engine3";
// where engine is a connection from ngnpro_engines.inc and
// port is valid port from that engine like sip_accounts or enum_numbers
$_filter_els=explode(" ",trim($filter));
foreach(array_keys($soapEngines) as $_engine) {
foreach ($_filter_els as $_filter) {
unset($_allowed_engine);
$_allowed_ports=array();
list($_allowed_engine,$_allowed_ports_els) = explode(":",$_filter);
if ($_allowed_ports_els) {
$_allowed_ports = explode(",",$_allowed_ports_els);
}
if ($_engine == $_allowed_engine) {
$soapEngines_checked[$_engine]=$soapEngines[$_engine];
$this->allowedPorts[$_engine]=$_allowed_ports;
continue;
}
}
}
return $soapEngines_checked;
}
}
class Actions {
// this class perfom actions on an array of entities returned by selections
var $actions = array();
var $version = 1;
var $sub_action_parameter_size = 35;
var $html = true;
function Actions($SoapEngine, $login_credentials) {
$this->SoapEngine = $SoapEngine;
$this->login_credentials = $login_credentials;
$this->version = $this->SoapEngine->version;
$this->adminonly = $this->SoapEngine->adminonly;
}
function log_action($action='Unknown') {
global $CDRTool;
$location = "Unknown";
$_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']);
if ($_loc['country_name']) {
$location = $_loc['country_name'];
}
$log = sprintf("CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s",
$this->login_credentials['username'],
$this->login_credentials['login_type'],
$CDRTool['impersonate'],
$_SERVER['REMOTE_ADDR'],
$location,
$this->SoapEngine->port,
$action,
$_SERVER['PHP_SELF']
);
syslog(LOG_NOTICE, $log);
}
function execute($selectionKeys, $action, $sub_action_parameter) {
}
function showActionsForm($filters,$sorting,$hideParameter=false) {
if (!count($this->actions)) return;
printf ("",$_SERVER['PHP_SELF']);
print "
";
print "
";
if ($this->adminonly) {
print "
adminonly>
";
}
print " ";
if (!$hideParameter) {
printf ("
",$this->sub_action_parameter_size);
}
print "
";
print " Maximum of 500 records
";
foreach (array_keys($filters) as $_filter) {
printf (" \n", $_filter,$filters[$_filter]);
}
foreach (array_keys($sorting) as $_sorting) {
printf (" \n", $_sorting,$sorting[$_sorting]);
}
printf(" ",$this->SoapEngine->service);
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
printf (" \n",$element,$this->SoapEngine->extraFormElements[$element]);
}
print "
";
}
}
class SipAccountsActions extends Actions {
var $actions=array('block' => 'Block SIP accounts',
'deblock' => 'Deblock SIP accounts',
'enable_pstn' => 'Enable access to PSTN for the SIP accounts',
'disable_pstn' => 'Disable access to PSTN for the SIP accounts',
'deblock_quota' => 'Deblock SIP accounts blocked by quota',
'prepaid' => 'Make SIP accounts prepaid',
'postpaid' => 'Make SIP accounts postpaid',
'delete' => 'Delete SIP accounts',
'setquota' => 'Set quota of SIP account to:',
'rpidasusername' => 'Set PSTN caller ID as the username',
'prefixtorpid' => 'Add to PSTN caller ID this prefix:',
'rmdsfromrpid' => 'Remove from PSTN caller ID digits:',
'addtogroup' => 'Add SIP accounts to group:',
'removefromgroup'=> 'Remove SIP accounts from group:',
'addbalance' => 'Add to prepaid balance value:',
'changeowner' => 'Change owner to:',
'changefirstname'=> 'Change first name to:',
'changelastname' => 'Change last name to:',
'changepassword' => 'Change password to:'
);
function SipAccountsActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
//printf ("Performing action=%s on key=%s",$action,$key);
$account=array('username' => $key['username'],
'domain' => $key['domain']
);
printf ("- %s@%s",$key['username'],$key['domain']);
if ($action=='block') {
$this->log_action('addToGroup');
$function=array('commit' => array('name' => 'addToGroup',
'parameters' => array($account,'blocked'),
'logs' => array('success' => sprintf('SIP account %s@%s has been blocked',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='deblock') {
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,'blocked'),
'logs' => array('success' => sprintf('SIP account %s@%s has been de-blocked',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='removefromgroup') {
if (!strlen($sub_action_parameter)) {
printf ("Error: you must enter a group name");
break;
}
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,$sub_action_parameter),
'logs' => array('success' => sprintf('SIP account %s@%s has been removed from group %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='addtogroup') {
$this->log_action('addToGroup');
if (!strlen($sub_action_parameter)) {
printf ("Error: you must enter a group name");
break;
}
$function=array('commit' => array('name' => 'addToGroup',
'parameters' => array($account,$sub_action_parameter),
'logs' => array('success' => sprintf('SIP account %s@%s is now in group %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='deblock_quota') {
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,'quota'),
'logs' => array('success' => sprintf('SIP account %s@%s has been deblocked from quota',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='disable_pstn') {
$this->log_action('removeFromGroup');
$function=array('commit' => array('name' => 'removeFromGroup',
'parameters' => array($account,'free-pstn'),
'logs' => array('success' => sprintf('SIP account %s@%s has no access to the PSTN',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='enable_pstn') {
$this->log_action('addToGroup');
$function=array('commit' => array('name' => 'addToGroup',
'parameters' => array($account,'free-pstn'),
'logs' => array('success' => sprintf('SIP account %s@%s has access to the PSTN',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='delete') {
$this->log_action('deleteAccount');
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array($account),
'logs' => array('success' => sprintf('SIP account %s@%s has been deleted',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='prepaid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$result->prepaid=1;
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s is now prepaid',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='postpaid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$result->prepaid=0;
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s is now postpaid',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='setquota') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->quota = intval($sub_action_parameter);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has quota set to %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='rmdsfromrpid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter) && strlen($result->rpid) > $sub_action_parameter) {
printf("%s %s",$result->rpid,$sub_action_parameter);
$result->rpid=substr($result->rpid,$sub_action_parameter);
printf("%s %s",$result->rpid,$sub_action_parameter);
} else {
printf ("Error: '%s' must be numeric and less than caller if length",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$result->rpid)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='rpidasusername') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($key['username'])) $result->rpid=$key['username'];
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s',$key['username'],$key['domain'],$key['username'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='prefixtorpid') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter)) {
$result->rpid=$sub_action_parameter.$result->rpid;
} else {
printf ("Error: '%s' must be numeric",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has PSTN caller ID set to %s ',$key['username'],$key['domain'],$result->rpid)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changecustomer') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter)) {
$result->customer=intval($sub_action_parameter);
} else {
printf ("Error: '%s' must be numeric",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has customer set to %s ',$key['username'],$key['domain'],$result->customer)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changeowner') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
//print_r($result);
// Sanitize data types due to PHP bugs
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (is_numeric($sub_action_parameter)) {
$result->owner=intval($sub_action_parameter);
} else {
printf ("Error: '%s' must be numeric",$sub_action_parameter);
continue;
}
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s has owner set to %s ',$key['username'],$key['domain'],$result->owner)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changefirstname') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->firstName=trim($sub_action_parameter);
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s first name has been set to %s ',$key['username'],$key['domain'],$result->firstName)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changelastname') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->lastName=trim($sub_action_parameter);
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('SIP account %s@%s last name has been set to %s ',$key['username'],$key['domain'],$result->lastName)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='changepassword') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
$result->password=trim($sub_action_parameter);
$result->quota = intval($result->quota);
$result->answerTimeout = intval($result->answerTimeout);
$this->log_action('updateAccount');
$function=array('commit' => array('name' => 'updateAccount',
'parameters' => array($result),
'logs' => array('success' => sprintf('Password for SIP account %s@%s has been changed',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action=='addbalance') {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: you must enter a positive balance");
break;
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getAccount');
$result = $this->SoapEngine->soapclient->getAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
}
if (!$result->prepaid) {
printf ("Info: SIP account %s@%s is not prepaid, no action performed",$key['username'],$key['domain']);
continue;
}
$this->log_action('addBalance');
$function=array('commit' => array('name' => 'addBalance',
'parameters' => array($account,$sub_action_parameter),
'logs' => array('success' => sprintf('SIP account %s@%s balance has been increased with %s',$key['username'],$key['domain'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
print "
";
}
}
class SipAliasesActions extends Actions {
var $actions=array(
'delete' => 'Delete SIP aliases'
);
function SipAliasesActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action";
return false;
}
print "";
foreach($selectionKeys as $key) {
print "- ";
flush();
//printf ("Performing action=%s on key=%s",$action,$key);
$alias=array('username' => $key['username'],
'domain' => $key['domain']
);
if ($action=='delete') {
$this->log_action('deleteAlias');
$function=array('commit' => array('name' => 'deleteAlias',
'parameters' => array($alias),
'logs' => array('success' => sprintf('SIP alias %s@%s has been deleted',$key['username'],$key['domain'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
print "
";
}
}
class EnumMappingsActions extends Actions {
var $actions=array(
'changettl' => 'Change TTL to:',
'changeowner' => 'Change owner to:',
'changeinfo' => 'Change info to:',
'delete' => 'Delete ENUM mappings'
);
var $mapping_fields=array('id' => 'integer',
'type' => 'text',
'mapto' => 'text',
'priority' => 'integer',
'ttl' => 'integer'
);
function EnumMappingsActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
print "- ";
$enum_id=array('number' => $key['number'],
'tld' => $key['tld']
);
if ($action=='delete') {
//printf ("Performing action=%s on key=%s",$action,$key);
$function=array('commit' => array('name' => 'deleteNumber',
'parameters' => array($enum_id),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$key['number'],$key['tld'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action == 'changettl') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$number = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($number)) {
$error_msg = $number->getMessage();
$error_fault= $number->getFault();
$error_code = $number->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: TTL '%s' must be numeric",$sub_action_parameter);
continue;
}
$new_mappings=array();
foreach ($number->mappings as $_mapping) {
foreach (array_keys($this->mapping_fields) as $field) {
if ($field == 'ttl') {
$new_mapping[$field]=intval($sub_action_parameter);
} else {
if ($this->mapping_fields[$field] == 'integer') {
$new_mapping[$field]=intval($_mapping->$field);
} else {
$new_mapping[$field]=$_mapping->$field;
}
}
}
$new_mappings[]=$new_mapping;
}
$number->mappings=$new_mappings;
$this->log_action('updateNumber');
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number %s@%s TTL has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeowner') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$number = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($number)) {
$error_msg = $number->getMessage();
$error_fault= $number->getFault();
$error_code = $number->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$new_mappings=array();
foreach ($number->mappings as $_mapping) {
$new_mappings[]=$_mapping;
}
$number->mappings=$new_mappings;
if (is_numeric($sub_action_parameter)) {
$number->owner=intval($sub_action_parameter);
} else {
printf ("Error: Owner '%s' must be numeric",$sub_action_parameter);
continue;
}
$this->log_action('updateNumber');
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number %s@%s owner has been set to %d',$key['number'],$key['tld'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeinfo') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$number = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($number)) {
$error_msg = $number->getMessage();
$error_fault= $number->getFault();
$error_code = $number->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$new_mappings=array();
foreach ($number->mappings as $_mapping) {
$new_mappings[]=$_mapping;
}
$number->mappings=$new_mappings;
$number->info=trim($sub_action_parameter);
$this->log_action('updateNumber');
$function=array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number %s@%s info has been set to %s',$key['number'],$key['tld'],trim($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
}
print "
";
}
}
class DnsRecordsActions extends Actions {
var $sub_action_parameter_size = 50;
var $actions = array(
'changettl' => 'Change TTL to:',
'changepriority' => 'Change Priority to:',
'changevalue' => 'Change value to:',
'delete' => 'Delete records'
);
function DnsRecordsActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys, $action, $sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
print "- ";
//printf ("Performing action=%s on key=%s",$action,$key['id']);
if ($action=='delete') {
$this->log_action('deleteRecord');
$function=array('commit' => array('name' => 'deleteRecord',
'parameters' => array(intval($key['id'])),
'logs' => array('success' => sprintf('Record %d has been deleted',$key['id'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action == 'changettl') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecord');
$record = $this->SoapEngine->soapclient->getRecord($key['id']);
if ((new PEAR)->isError($record)) {
$error_msg = $record->getMessage();
$error_fault= $record->getFault();
$error_code = $record->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: TTL '%s' must be numeric",$sub_action_parameter);
continue;
}
$record->ttl=intval($sub_action_parameter);
$this->log_action('updateRecord');
$function=array('commit' => array('name' => 'updateRecord',
'parameters' => array($record),
'logs' => array('success' => sprintf('TTL for record %d has been set to %d',$key['id'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changepriority') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecord');
$record = $this->SoapEngine->soapclient->getRecord($key['id']);
if ((new PEAR)->isError($record)) {
$error_msg = $record->getMessage();
$error_fault= $record->getFault();
$error_code = $record->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (is_numeric($sub_action_parameter)) {
$record->priority=intval($sub_action_parameter);
} else {
printf ("Error: Priority '%s' must be numeric",$sub_action_parameter);
continue;
}
$this->log_action('updateRecord');
$function=array('commit' => array('name' => 'updateRecord',
'parameters' => array($record),
'logs' => array('success' => sprintf('Priority for record %d has been set to %d',$key['id'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changevalue') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecord');
$record = $this->SoapEngine->soapclient->getRecord($key['id']);
if ((new PEAR)->isError($record)) {
$error_msg = $record->getMessage();
$error_fault= $record->getFault();
$error_code = $record->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$record->value=$sub_action_parameter;
$this->log_action('updateRecord');
$function=array('commit' => array('name' => 'updateRecord',
'parameters' => array($record),
'logs' => array('success' => sprintf('Value of record %d has been set to %s',$key['id'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
}
print "
";
}
}
class DnsZonesActions extends Actions {
var $sub_action_parameter_size = 50;
var $actions=array(
'changettl' => 'Change TTL to:',
'changeexpire' => 'Change Expire to:',
'changeminimum' => 'Change Minimum to:',
'changeretry' => 'Change Retry to:',
'changeinfo' => 'Change Info to:',
'addnsrecord' => 'Add name server:',
'removensrecord' => 'Remove name server:',
'delete' => 'Delete zones',
'export' => 'Export zones'
);
function DnsZonesActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action";
return false;
}
if ($action!='export') {
print "";
} else {
$exported_data=array('dns_zones'=>array());
$export_customers=array();
}
foreach($selectionKeys as $key) {
flush();
if ($action!='export') {
print "- ";
}
//printf ("Performing action=%s on key=%s",$action,$key['name']);
if ($action=='delete') {
$this->log_action('deleteZone');
$function=array('commit' => array('name' => 'deleteZone',
'parameters' => array($key['name']),
'logs' => array('success' => sprintf('Zone %s has been deleted',$key['name'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
} else if ($action=='export') {
// Filter
$filter=array(
'zone' => $key['name']
);
$range = array('start' => 0,'count' => 5000);
// Compose query
$Query=array('filter' => $filter,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$result = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
if (!in_array($result->customer, $export_customers)) {
$export_customers[]=$result->customer;
}
if (!in_array($result->reseller, $export_customers)) {
$export_customers[]=$result->reseller;
}
$exported_data['dns_zones'][] = objectToArray($result);
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecords');
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient,'getRecords'),array($Query));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['dns_records'] = objectToArray($result->records);
}
} else if ($action == 'changettl') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: TTL '%s' must be numeric",$sub_action_parameter);
continue;
}
$zone->ttl=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('TTL for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeexpire') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: Expire '%s' must be numeric",$sub_action_parameter);
continue;
}
$zone->expire=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Expire for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeminimum') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: Minimum '%s' must be numeric",$sub_action_parameter);
continue;
}
$zone->minimum=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Minimum for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'addnsrecord') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$zone->nameservers[]=$sub_action_parameter;
$zone->nameservers=array_unique($zone->nameservers);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Added NS record %s for zone %s',$sub_action_parameter,$key['name'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'removensrecord') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$new_servers=array();
foreach ($zone->nameservers as $_ns) {
if ($_ns == $sub_action_parameter) continue;
$new_servers[]=$_ns;
}
$zone->nameservers=array_unique($new_servers);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('NS record %s removed from zone %s',$sub_action_parameter,$key['name'])
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeretry') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
if (!is_numeric($sub_action_parameter)) {
printf ("Error: Retry '%s' must be numeric",$sub_action_parameter);
continue;
}
$zone->retry=intval($sub_action_parameter);
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Retry for zone %s has been set to %d',$key['name'],intval($sub_action_parameter))
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
} else if ($action == 'changeinfo') {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZone');
$zone = $this->SoapEngine->soapclient->getZone($key['name']);
if ((new PEAR)->isError($zone)) {
$error_msg = $zone->getMessage();
$error_fault= $zone->getFault();
$error_code = $zone->getCode();
printf ("Error: %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
break;
} else {
$zone->info=$sub_action_parameter;
$this->log_action('updateZone');
$function=array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('Info for zone %s has been set to %s',$key['name'],$sub_action_parameter)
)
)
);
$this->SoapEngine->execute($function,$this->html);
}
}
}
if ($action!='export') {
print "
";
} else {
// Filter
foreach ($export_customers as $customer) {
$filter=array(
'customer' => intval($customer),
);
// Compose query
$Query=array('filter' => $filter
);
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$this->getCustomers('getZone');
// Call function
$result = $this->SoapEngine->soapclientCustomers->getCustomers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$log=sprintf("SOAP request error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
} else {
$exported_data['customers'] = objectToArray($result->accounts);
}
}
print_r(json_encode($exported_data));
}
}
}
class CustomersActions extends Actions {
var $actions=array(
'delete' => 'Delete customers'
);
function CustomerActions($SoapEngine, $login_credentials) {
$this->Actions($SoapEngine, $login_credentials);
}
function execute($selectionKeys,$action,$sub_action_parameter) {
if (!in_array($action,array_keys($this->actions))) {
print "Error: Invalid action $action";
return false;
}
print "";
foreach($selectionKeys as $key) {
flush();
print "- ";
if ($action=='delete') {
$this->log_action('deleteAccount');
$function=array('commit' => array('name' => 'deleteAccount',
'parameters' => array(intval($key)),
'logs' => array('success' => sprintf('Customer id %s has been deleted',$key)))
);
$this->SoapEngine->execute($function,$this->html);
}
}
print "
";
}
}
function check_ip_access_list($acl_string, $check=false) {
$list=explode(" ",$acl_string);
$ip_access_list = array();
foreach ($list as $el) {
$els = explode("/",$el);
if (count($els) != 2) {
if ($check) {
return false;
} else {
continue;
}
}
list($ip,$mask) = $els;
if ($mask <0 or $mask > 32) {
if ($check) {
return false;
} else {
continue;
}
}
if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) {
if ($check) {
return false;
} else {
continue;
}
}
$ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask));
}
if ($check) {
return true;
} else {
return $ip_access_list;
}
}
function objectToArray($d) {
if (is_object($d)) {
// Gets the properties of the given object
// with get_object_vars function
$d = get_object_vars($d);
}
if (is_array($d)) {
/*
* Return array converted to object
* Using __FUNCTION__ (Magic constant)
* for recursive call
*/
return array_map(__FUNCTION__, $d);
}
else {
// Return array
return $d;
}
}
?>
diff --git a/library/sip_settings.php b/library/sip_settings.php
index f418570..55267f1 100644
--- a/library/sip_settings.php
+++ b/library/sip_settings.php
@@ -1,13059 +1,13086 @@
";
var $billing_email = "Billing ";
var $sip_settings_page = "https://cdrtool.example.com/sip_settings.phtml";
var $xcap_root = "https://cdrtool.example.com/xcap-root";
var $pstn_access = false;
var $sms_access = false;
var $pstn_changes_allowed = false;
var $prepaid_changes_allowed = false;
var $sip_proxy = "proxy.example.com";
+ var $sip_outbound_proxy = "";
+ var $sip_mobile_outbound_proxy = "";
var $voicemail_server = "vm.example.com";
var $absolute_voicemail_uri = false; // use
var $enable_thor = false;
var $currency = "€";
// access numbers
var $voicemail_access_number = "1233";
var $FUNC_access_number = "*21*";
var $FNOL_access_number = "*22*";
var $FNOA_access_number = "*23*";
var $FBUS_access_number = "*23*";
var $change_privacy_access_number = "*67";
var $check_privacy_access_number = "*68";
var $reject_anonymous_access_number = "*69";
var $show_barring_tab = false;
var $show_payments_tab = false;
var $show_tls_section = false;
var $show_support_tab = false;
var $show_did_tab = false;
var $show_directory = false;
var $notify_on_sip_account_changes = false;
var $first_tab = 'calls';
var $auto_refesh_tab = 0; // number of seconds after which to refresh tab content in the web browser
var $payment_processor_class = false;
var $did_processor_class = false;
var $show_download_tab = 'Blink'; // set it to name of the tab or false to disable it
var $digest_settings_page = "https://blink.sipthor.net/settings.phtml";
// end variables
var $tab = "settings";
var $phonebook_img = "";
var $call_img = "";
var $delete_img = " ";
var $plus_sign_img = " ";
var $embedded_img = " ";
var $groups = array();
var $form_elements = array(
'mailto',
'free-pstn',
'blocked',
'sip_password',
'web_password',
'yubikey',
'first_name',
'last_name',
'quota',
'language',
'quota_deblock',
'voicemail',
'anonymous',
'advanced',
'rpid',
'timezone',
'accept',
'accept_temporary_group',
'accept_temporary_remain',
'web_timestamp',
'web_password_reset',
'acceptDailyStartTime',
'acceptDailyStopTime',
'acceptDailyGroup',
'quickdial',
'delete_voicemail',
'voicemail_password',
'region',
'timeout',
'owner',
'mobile_number',
'extra_groups',
'show_barring_tab',
'ip_access_list',
'callLimit'
);
var $disable_extra_groups=true;
var $prepaid = 0;
var $emergency_regions = array();
var $FNOA_timeoutDefault = 35;
var $enums = array();
var $barring_prefixes = array();
var $SipUAImagesPath = "images";
var $SipUAImagesFile = "phone_images.php";
var $balance_history = array();
var $enrollment_url = false;
var $sip_settings_api_url= false;
var $journalEntries = array();
var $chat_replication_backend = 'mysql'; // mongo or mysql
var $owner_information =array();
var $languages=array("en"=>array('name'=>"English",
'timezone'=>''
),
"ro"=>array('name'=>"Română",
'timezone' => 'Europe/Bucharest'
),
"nl"=>array('name'=>"Nederlands",
'timezone' => 'Europe/Amsterdam'
),
"es"=>array('name'=>"Español",
'timezone' => 'Europe/Madrid'
),
"de"=>array('name'=>"Deutsch",
'timezone' => 'Europe/Berlin'
)
);
var $pstn_termination_price_page = 'sip_rates_body.html';
var $append_domain_to_xcap_root = false;
var $blink_download_url = "https://blink.sipthor.net/download.phtml?download";
var $ownerCredentials = array();
var $localGroups = array();
var $max_credit_per_day = 40;
var $enrollment_configuration = "/etc/cdrtool/enrollment/config.ini";
var $require_proof_of_identity = true;
var $call_limit_may_by_changed_by = 'reseller'; #subscriber, reseller, admin
var $ip_access_list_may_by_changed_by = 'reseller'; #subscriber, reseller, admin
var $create_certificate = false;
function SipSettings($account,$loginCredentials=array(),$soapEngines=array()) {
//define_syslog_variables();
$this->platform_call_limit = _('unlimited');
$this->soapEngines = $soapEngines;
$debug=sprintf(" Initialize %s(%s) ",get_class($this),$account);
dprint($debug);
//dprint_r($loginCredentials);
$this->loginCredentials = &$loginCredentials;
if ($this->isEmbedded()) {
$this->login_type = 'subscriber';
} else {
if ($loginCredentials['login_type']) {
$this->login_type = $loginCredentials['login_type'];
} else {
$this->login_type = 'subscriber';
}
}
$this->reseller = $loginCredentials['reseller'];
$this->customer = $loginCredentials['customer'];
if (strlen($loginCredentials['sip_engine'])) {
$this->sip_engine=$loginCredentials['sip_engine'];
} else {
print _("Error: missing sip_engine in login credentials");
return false;
}
$this->settingsPage = $_SERVER['PHP_SELF'];
if ($_REQUEST['tab']) {
$this->tab = $_REQUEST['tab'];
} else {
$this->tab = $this->first_tab;
}
$this->initSoapClient();
$this->getAccount($account);
if ($this->tab=='calls' && !$_REQUEST['export']) {
$this->auto_refesh_tab=180;
}
$this->admin_url = $this->settingsPage."?account=$this->account&adminonly=1&reseller=$this->reseller&sip_engine=$this->sip_engine";
$this->reseller_url = $this->settingsPage."?account=$this->account&reseller=$this->reseller&sip_engine=$this->sip_engine";
$this->admin_url_absolute = $this->sip_settings_page."?account=$this->account&adminonly=1&reseller=$this->reseller&sip_engine=$this->sip_engine";
if ($this->login_type == "admin") {
$this->url=$this->admin_url;
$this->hiddenElements="
account\">
reseller>
sip_engine>
";
} else if ($this->login_type == "reseller" || $this->login_type == "customer") {
$this->url=$this->reseller_url;
$this->hiddenElements="
account\">
reseller>
sip_engine>
";
} else {
$this->url=$this->settingsPage;
if (!$this->isEmbedded()) {
$this->url.="?account=$this->account";
} else {
$this->url.=sprintf("?1=1&realm=%s",urlencode($_REQUEST['realm']));
if ($_REQUEST['user_agent']) {
$this->url.=sprintf("&user_agent=%s",urlencode($_REQUEST['user_agent']));
}
}
$this->hiddenElements=sprintf("
",
$this->account,
$this->sip_engine,
$_REQUEST['user_agent'],
$_REQUEST['realm']
);
}
$this->setLanguage();
if (!$this->username) {
dprint ("Record not found.");
return false;
}
$this->availableGroups['blocked'] = array("Group"=>"blocked",
"WEBName" =>sprintf(_("Status")),
"SubscriberMayEditIt"=>0,
"SubscriberMaySeeIt"=>0,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
$this->availableGroups['deny-password-change'] = array("Group"=>"deny-password-change",
"WEBName" =>sprintf(_("Deny password change")),
"SubscriberMayEditIt"=>0,
"SubscriberMaySeeIt"=>0,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
$this->getResellerSettings();
$this->getCustomerSettings();
if ($this->reject_anonymous_access_number) {
$_comment = sprintf(_("Dial %s to change"), $this->reject_anonymous_access_number);
} else {
$_comment = '';
}
$this->availableGroups['anonymous-reject']=array("Group"=>$this->anonymous-reject,
"WEBName" =>sprintf (_("Reject Anonymous")),
"WEBComment"=>$_comment,
"SubscriberMaySeeIt"=>1,
"SubscriberMayEditIt"=>1,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
$this->availableGroups['missed-calls']=array("Group"=>'missed-calls',
"WEBName" =>sprintf (_("Email Missed Calls")),
"WEBComment"=>'',
"SubscriberMaySeeIt"=>1,
"SubscriberMayEditIt"=>1,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
$this->availableGroups=array_merge($this->availableGroups, $this->localGroups);
$this->pstnChangesAllowed();
$this->smsChangesAllowed();
$this->prepaidChangesAllowed();
$this->tabs=array('identity'=>_('Identity'),
'devices'=>_('Devices'),
'settings'=>_('Settings'),
'diversions'=>_('Forwarding'),
'accept' =>_("DND"),
'contacts'=>_("Contacts"),
'calls'=>_('History'),
);
if (in_array("free-pstn",$this->groups)) {
if ($this->show_barring_tab || $this->Preferences['show_barring_tab']) {
$this->tabs['barring']=_("Barring");
}
}
if ($this->show_did_tab) {
$this->tabs['did']=_("DID");
}
if (!$this->isEmbedded() && $this->show_download_tab) {
$this->tabs['download'] = $this->show_download_tab;
}
$this->acceptDailyProfiles=array('127' => _('Every day'),
'31' => _('Weekday'),
'96' => _('Weekend'),
'1' => _('Monday'),
'2' => _('Tuesday'),
'4' => _('Wednesday'),
'8' => _('Thursday'),
'16' => _('Friday'),
'32' => _('Saturday'),
'64' => _('Sunday')
);
$this->PhonebookGroups=array(
"vip" =>sprintf(_("VIP")),
"business" =>sprintf(_("Business")),
"coworkers" =>sprintf(_("Coworkers")),
"friends" =>sprintf(_("Friends")),
"family" =>sprintf(_("Family"))
);
$this->diversionType=array(
"FUNC"=>sprintf(_("All Calls")),
"FNOL"=>sprintf(_("If Not-Online")),
"FBUS"=>sprintf(_("If Busy")),
"FNOA"=>sprintf(_("If No-Answer")),
"FUNV"=>sprintf(_("If Unavailable"))
);
$this->diversionTypeUNV=array(
"FUNV"=>sprintf(_("If Unavailable"))
);
$this->VoicemaildiversionType=array(
"FNOL"=>sprintf(_("If Not-Online")),
"FBUS"=>sprintf(_("If Busy")),
"FNOA"=>sprintf(_("If No-Answer")),
"FUNV"=>sprintf(_("If Unavailable"))
);
$this->access_numbers=array("FUNC"=>$this->FUNC_access_number,
"FNOA"=>$this->FNOA_access_number,
"FBUS"=>$this->FBUS_access_number,
"FNOL"=>$this->FNOL_access_number
);
if ($this->prepaid && $this->pstn_access) {
$this->tabs['credit']=_("Credit");
}
$_protocol=preg_match("/^(https?:\/\/)/",$_SERVER['SCRIPT_URI'],$m);
$this->absolute_url=$m[1].$_SERVER['HTTP_HOST'].$this->url;
if ($this->prepaid && $this->show_payments_tab) {
$this->tabs['payments']=_("Payments");
}
if ($this->show_support_tab) {
$this->tabs['support'] = 'Support';
}
}
function initSoapClient() {
dprint("initSoapClient()");
// Sip, Voicemail and Customer ports share same login
$this->SOAPurl=$this->soapEngines[$this->sip_engine]['url'];
$this->SOAPversion=$this->soapEngines[$this->sip_engine]['version'];
if ($this->soapEngines[$this->sip_engine]['enrollment_url']) {
$this->enrollment_url =$this->soapEngines[$this->sip_engine]['enrollment_url'];
}
if ($this->soapEngines[$this->sip_engine]['chat_replication_backend']) {
$this->chat_replication_backend = $this->soapEngines[$this->sip_engine]['chat_replication_backend'];
}
if ($this->soapEngines[$this->sip_engine]['mongo_db']) {
$this->mongo_db = $this->soapEngines[$this->sip_engine]['mongo_db'];
}
if ($this->soapEngines[$this->sip_engine]['sip_settings_api_url']) {
$this->sip_settings_api_url =$this->soapEngines[$this->sip_engine]['sip_settings_api_url'];
}
if (strlen($this->loginCredentials['soapUsername'])) {
$this->SOAPlogin = array(
"username" => $this->loginCredentials['soapUsername'],
"password" => $this->loginCredentials['soapPassword'],
"admin" => false
);
$this->soapUsername = $this->loginCredentials['soapUsername'];
} else {
$this->SOAPlogin = array(
"username" => $this->soapEngines[$this->sip_engine]['username'],
"password" => $this->soapEngines[$this->sip_engine]['password'],
"admin" => true,
"impersonate" => intval($this->customer)
);
$this->soapUsername = $this->soapEngines[$this->sip_engine]['username'];
}
$this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, '');
//print_r($this->SoapAuth);
$this->SOAPloginAdmin = array(
"username" => $this->soapEngines[$this->sip_engine]['username'],
"password" => $this->soapEngines[$this->sip_engine]['password'],
"admin" => true
);
$this->SoapAuthAdmin = array('auth', $this->SOAPloginAdmin , 'urn:AGProjects:NGNPro', 0, '');
if (strlen($this->loginCredentials['customer_engine'])) {
$this->customer_engine=$this->loginCredentials['customer_engine'];
} else if (strlen($this->soapEngines[$this->sip_engine]['customer_engine'])) {
$this->customer_engine=$this->soapEngines[$this->sip_engine]['customer_engine'];
} else {
$this->customer_engine=$this->sip_engine;
}
if (strlen($this->loginCredentials['voicemail_engine'])) {
$this->voicemail_engine=$this->loginCredentials['voicemail_engine'];
} else if (strlen($this->soapEngines[$this->sip_engine]['voicemail_engine'])) {
$this->voicemail_engine=$this->soapEngines[$this->sip_engine]['voicemail_engine'];
} else {
$this->voicemail_engine=$this->sip_engine;
}
if (strlen($this->loginCredentials['enum_engine'])) {
$this->enum_engine=$this->loginCredentials['enum_engine'];
} else if (strlen($this->soapEngines[$this->sip_engine]['enum_engine'])) {
$this->enum_engine=$this->soapEngines[$this->sip_engine]['enum_engine'];
} else {
$this->enum_engine=$this->sip_engine;
}
if (strlen($this->loginCredentials['rating_engine'])) {
$this->rating_engine=$this->loginCredentials['rating_engine'];
} else if (strlen($this->soapEngines[$this->sip_engine]['rating_engine'])) {
$this->rating_engine=$this->soapEngines[$this->sip_engine]['rating_engine'];
} else {
$this->rating_engine=$this->sip_engine;
}
// overwrite default settings
if (strlen($this->soapEngines[$this->sip_engine]['sip_proxy'])) {
$this->sip_proxy = $this->soapEngines[$this->sip_engine]['sip_proxy'];
}
+ if (strlen($this->soapEngines[$this->sip_engine]['sip_outbound_proxy'])) {
+ $this->sip_outbound_proxy = $this->soapEngines[$this->sip_engine]['sip_outbound_proxy'];
+ }
+
if (strlen($this->soapEngines[$this->sip_engine]['support_company'])) {
$this->support_company = $this->soapEngines[$this->sip_engine]['support_company'];
}
if (strlen($this->soapEngines[$this->sip_engine]['support_web'])) {
$this->support_web = $this->soapEngines[$this->sip_engine]['support_web'];
}
if (strlen($this->soapEngines[$this->sip_engine]['support_email'])) {
$this->support_email = $this->soapEngines[$this->sip_engine]['support_email'];
}
if (strlen($this->soapEngines[$this->sip_engine]['billing_email'])) {
$this->billing_email = $this->soapEngines[$this->sip_engine]['billing_email'];
}
if (strlen($this->soapEngines[$this->sip_engine]['sip_settings_page'])) {
$this->sip_settings_page = $this->soapEngines[$this->sip_engine]['sip_settings_page'];
}
if (strlen($this->soapEngines[$this->sip_engine]['digest_settings_page'])) {
$this->digest_settings_page = $this->soapEngines[$this->sip_engine]['digest_settings_page'];
}
if (strlen($this->soapEngines[$this->sip_engine]['xcap_root'])) {
$this->xcap_root = $this->soapEngines[$this->sip_engine]['xcap_root'];
}
if (strlen($this->soapEngines[$this->sip_engine]['cdrtool_address'])) {
$this->cdrtool_address = $this->soapEngines[$this->sip_engine]['cdrtool_address'];
}
if (strlen($this->soapEngines[$this->sip_engine]['msrp_relay'])) {
$this->msrp_relay = $this->soapEngines[$this->sip_engine]['msrp_relay'];
}
if ($this->soapEngines[$this->sip_engine]['emergency_regions']) {
$this->emergency_regions = $this->soapEngines[$this->sip_engine]['emergency_regions'];
}
if ($this->soapEngines[$this->sip_engine]['pstn_access']) {
$this->pstn_access = $this->soapEngines[$this->sip_engine]['pstn_access'];
}
if ($this->soapEngines[$this->sip_engine]['call_limit']) {
$this->platform_call_limit = $this->soapEngines[$this->sip_engine]['call_limit'];
}
if ($this->soapEngines[$this->sip_engine]['sms_access']) {
$this->sms_access = $this->soapEngines[$this->sip_engine]['sms_access'];
}
if ($this->soapEngines[$this->sip_engine]['voicemail_server']) {
$this->voicemail_server = $this->soapEngines[$this->sip_engine]['voicemail_server'];
}
if ($this->soapEngines[$this->sip_engine]['currency']) {
$this->currency = $this->soapEngines[$this->sip_engine]['currency'];
}
if ($this->soapEngines[$this->sip_engine]['voicemail_access_number']) {
$this->voicemail_access_number = $this->soapEngines[$this->sip_engine]['voicemail_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['FUNC_access_number']) {
$this->FUNC_access_number = $this->soapEngines[$this->sip_engine]['FUNC_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['FNOA_access_number']) {
$this->FNOA_access_number = $this->soapEngines[$this->sip_engine]['FNOA_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['FBUS_access_number']) {
$this->FBUS_access_number = $this->soapEngines[$this->sip_engine]['FBUS_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['FNOL_access_number']) {
$this->FNOL_access_number = $this->soapEngines[$this->sip_engine]['FNOL_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['payment_processor_class']) {
$this->payment_processor_class = $this->soapEngines[$this->sip_engine]['payment_processor_class'];
}
if ($this->soapEngines[$this->sip_engine]['change_privacy_access_number']) {
$this->change_privacy_access_number = $this->soapEngines[$this->sip_engine]['change_privacy_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['check_privacy_access_number']) {
$this->check_privacy_access_number = $this->soapEngines[$this->sip_engine]['check_privacy_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['reject_anonymous_access_number']) {
$this->reject_anonymous_access_number = $this->soapEngines[$this->sip_engine]['reject_anonymous_access_number'];
}
if ($this->soapEngines[$this->sip_engine]['show_directory']) {
$this->show_directory = $this->soapEngines[$this->sip_engine]['show_directory'];
}
if (isset($this->soapEngines[$this->sip_engine]['absolute_voicemail_uri'])) {
$this->absolute_voicemail_uri = $this->soapEngines[$this->sip_engine]['absolute_voicemail_uri'];
}
if (isset($this->soapEngines[$this->sip_engine]['enable_thor'])) {
$this->enable_thor=$this->soapEngines[$this->sip_engine]['enable_thor'];
}
if (isset($this->soapEngines[$this->sip_engine]['sip_accounts_lite'])) {
$this->sip_accounts_lite=$this->soapEngines[$this->sip_engine]['sip_accounts_lite'];
}
if (strlen($this->soapEngines[$this->sip_engine]['timeout'])) {
$this->soapTimeout=intval($this->soapEngines[$this->sip_engine]['timeout']);
}
if (strlen($this->soapEngines[$this->sip_engine]['store_clear_text_passwords'])) {
$this->store_clear_text_passwords=$this->soapEngines[$this->sip_engine]['store_clear_text_passwords'];
}
if (isset($this->soapEngines[$this->sip_engine]['show_download_tab'])) {
$this->show_download_tab=$this->soapEngines[$this->sip_engine]['show_download_tab'];
}
if (strlen($this->soapEngines[$this->sip_engine]['show_barring_tab'])) {
$this->show_barring_tab=$this->soapEngines[$this->sip_engine]['show_barring_tab'];
}
if (isset($this->soapEngines[$this->sip_engine]['disable_extra_groups'])) {
$this->disable_extra_groups=$this->soapEngines[$this->sip_engine]['disable_extra_groups'];
}
if (strlen($this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes'])) {
//dprint($this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes']);
$this->notify_on_sip_account_changes=$this->soapEngines[$this->sip_engine]['notify_on_sip_account_changes'];
}
if ($this->loginCredentials['templates_path']) {
$this->templates_path = $this->loginCredentials['templates_path'];
} else if ($this->soapEngines[$this->sip_engine]['templates_path']) {
$this->templates_path = $this->soapEngines[$this->sip_engine]['templates_path'];
}
// Instantiate the SOAP clients
// sip
$this->SipPort = new $this->soapClassSipPort($this->SOAPurl);
$this->SipPort->_options['timeout'] = $this->soapTimeout;
$this->SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
if ($this->showSoapConnectionInfo) {
printf (" %s at %s as %s ",$this->soapClassSipPort,$this->SOAPurl,$this->SOAPurl,$this->soapUsername);
}
// voicemail
$this->SOAPurlVoicemail = $this->soapEngines[$this->voicemail_engine]['url'];
$this->SOAPloginVoicemail = array(
"username" => $this->soapEngines[$this->voicemail_engine]['username'],
"password" => $this->soapEngines[$this->voicemail_engine]['password'],
"admin" => true,
"impersonate" => intval($this->customer)
);
$this->SoapAuthVoicemail = array('auth', $this->SOAPloginVoicemail , 'urn:AGProjects:NGNPro', 0, '');
$this->VoicemailPort = new $this->soapClassVoicemailPort($this->SOAPurlVoicemail);
if (strlen($this->soapEngines[$this->voicemail_engine]['timeout'])) {
$this->VoicemailPort->_options['timeout'] = intval($this->soapEngines[$this->voicemail_engine]['timeout']);
} else {
$this->VoicemailPort->_options['timeout'] = $this->soapTimeout;
}
$this->VoicemailPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->VoicemailPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
if ($this->showSoapConnectionInfo && $this->SOAPurlVoicemail != $this->SOAPurl) {
printf (" %s at %s as %s ",$this->soapClassVoicemailPort,$this->SOAPurlVoicemail,$this->SOAPurlVoicemail,$this->soapEngines[$this->voicemail_engine]['username']);
}
// enum
$this->SOAPurlEnum = $this->soapEngines[$this->enum_engine]['url'];
$this->SOAPloginEnum = array(
"username" => $this->soapEngines[$this->enum_engine]['username'],
"password" => $this->soapEngines[$this->enum_engine]['password'],
"admin" => true,
"impersonate" => intval($this->customer)
);
$this->SoapAuthEnum = array('auth', $this->SOAPloginEnum , 'urn:AGProjects:NGNPro', 0, '');
$this->EnumPort = new $this->soapClassEnumPort($this->SOAPurlEnum);
if (strlen($this->soapEngines[$this->enum_engine]['timeout'])) {
$this->EnumPort->_options['timeout'] = intval($this->soapEngines[$this->enum_engine]['timeout']);
} else {
$this->EnumPort->_options['timeout'] = $this->soapTimeout;
}
$this->EnumPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->EnumPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
if ($this->showSoapConnectionInfo && $this->SOAPurlEnum != $this->SOAPurl) {
printf (" %s at %s as %s ",$this->soapClassEnumPort,$this->SOAPurlEnum,$this->SOAPurlEnum,$this->soapEngines[$this->enum_engine]['username']);
}
// rating
$this->SOAPurlRating = $this->soapEngines[$this->rating_engine]['url'];
$this->SOAPloginRating = array(
"username" => $this->soapEngines[$this->rating_engine]['username'],
"password" => $this->soapEngines[$this->rating_engine]['password'],
"admin" => true,
"impersonate" => intval($this->customer)
);
$this->SoapAuthRating = array('auth', $this->SOAPloginRating , 'urn:AGProjects:NGNPro', 0, '');
$this->RatingPort = new $this->soapClassRatingPort($this->SOAPurlRating);
if (strlen($this->soapEngines[$this->rating_engine]['timeout'])) {
$this->RatingPort->_options['timeout'] = intval($this->soapEngines[$this->rating_engine]['timeout']);
} else {
$this->RatingPort->_options['timeout'] = $this->soapTimeout;
}
$this->RatingPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->RatingPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
if ($this->showSoapConnectionInfo && $this->SOAPurlRating != $this->SOAPurl) {
printf (" %s at %s as %s ",$this->soapClassRatingPort,$this->SOAPurlRating,$this->SOAPurlRating,$this->soapEngines[$this->rating_engine]['username']);
}
// customer
$this->SOAPurlCustomer = $this->soapEngines[$this->customer_engine]['url'];
$this->SOAPloginCustomer = array(
"username" => $this->soapEngines[$this->customer_engine]['username'],
"password" => $this->soapEngines[$this->customer_engine]['password'],
"admin" => true
);
$this->SoapAuthCustomer = array('auth', $this->SOAPloginCustomer , 'urn:AGProjects:NGNPro', 0, '');
$this->CustomerPort = new $this->soapClassCustomerPort($this->SOAPurlCustomer);
if (strlen($this->soapEngines[$this->customer_engine]['timeout'])) {
$this->CustomerPort->_options['timeout'] = intval($this->soapEngines[$this->customer_engine]['timeout']);
} else {
$this->CustomerPort->_options['timeout'] = $this->soapTimeout;
}
$this->CustomerPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$this->CustomerPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
if ($this->showSoapConnectionInfo && $this->SOAPurlCustomer != $this->SOAPurl) {
printf (" %s at %s as %s ",$this->soapClassCustomerPort,$this->SOAPurlCustomer,$this->SOAPurlCustomer,$this->soapEngines[$this->customer_engine]['username']);
}
}
function getMongoJournalTable() {
$this->mongo_table_ro = NULL;
$this->mongo_table_rw = NULL;
$this->mongo_exception = 'Mongo exception';
if (is_array($this->mongo_db)) {
$mongo_uri = $this->mongo_db['uri'];
$mongo_replicaSet = $this->mongo_db['replicaSet'];
$mongo_database = $this->mongo_db['database'];
$mongo_table = $this->mongo_db['table'];
try {
$mongo_connection = new Mongo("mongodb://$mongo_uri", array("replicaSet" => $mongo_replicaSet));
$mongo_db = $mongo_connection->selectDB($mongo_database);
$this->mongo_table_ro = $mongo_db->selectCollection($mongo_table);
$this->mongo_table_ro->setSlaveOkay(true);
$this->mongo_table_rw = $mongo_db->selectCollection($mongo_table);
return true;
} catch (MongoException $e) {
$this->mongo_exception=$e->getMessage();
return false;
} catch (MongoConnectionException $e) {
$this->mongo_exception=$e->getMessage();
return false;
} catch (Exception $e) {
$this->mongo_exception=$e->getMessage();
return false;
}
}
return false;
}
function getAccount($account) {
dprint("getAccount($account, engine=$this->sip_engine)");
list($username,$domain)=explode("@",trim($account));
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getAccount(array("username" =>$username,"domain" =>$domain));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
//print " ";
dprint_r($result);
$this->owner = $result->owner;
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if (!$result->quota) $result->quota=0;
foreach ($result->properties as $_property) {
$this->Preferences[$_property->name]=$_property->value;
}
//dprint_r($this->Preferences);
if (!$this->Preferences['language']) {
$this->Preferences['language'] ='en';
}
if ( $this->Preferences['blocked_by'] && !in_array("blocked",$result->groups)) {
$this->Preferences['blocked_by']='';
}
$this->username = $result->id->username;
$this->domain = $result->id->domain;
$this->password = $result->password;
$this->firstName = $result->firstName;
$this->lastName = $result->lastName;
$this->rpid = $result->rpid;
$this->owner = $result->owner;
$this->timezone = $result->timezone;
$this->email = $result->email;
$this->groups = $result->groups;
$this->createDate = $result->createDate;
$this->web_password = $this->Preferences['web_password'];
$this->quickdial = $result->quickdialPrefix;
$this->timeout = intval($result->timeout);
$this->quota = $result->quota;
$this->prepaid = intval($result->prepaid);
$this->region = $result->region;
$this->account = $this->username."@".$this->domain;
$this->fullName = $this->firstName." ".$this->lastName;
$this->name = $this->firstName; // used by smarty
$this->yuibikey = $result->Preferences['yubikey'];
if ($this->soapEngines[$this->sip_engine]['call_limit']) {
if ($result->callLimit) {
$this->callLimit = $result->callLimit;
} else {
$this->callLimit = '';
}
}
if ($this->soapEngines[$this->sip_engine]['ip_access_list']) {
if (is_array($result->acl) and count($result->acl)) {
foreach (array_keys($result->acl) as $key) {
$this->ip_access_list .= sprintf("%s/%s ",$result->acl[$key]->ip, $result->acl[$key]->mask);
}
$this->ip_access_list = trim($this->ip_access_list);
} else {
$this->ip_access_list = $this->soapEngines[$this->sip_engine]['ip_access_list'];
}
}
$this->sipId=array("username" => $this->username,
"domain" => $this->domain
);
if (!$this->timeout) {
$this->timeoutWasNotSet=1;
$this->timeout=intval($this->FNOA_timeoutDefault);
}
if ($this->timeout > 900 ) {
$this->timeoutWasNotSet=1;
$this->timeout=intval(900);
}
$this->getOwnerSettings($this->owner);
$this->getDomainOwner($this->domain);
$this->getMobileNumber();
if ($this->append_domain_to_xcap_root) {
$this->xcap_root = rtrim($this->xcap_root,'/')."@".$this->domain."/";
}
$this->result = $result;
}
function showAccount() {
dprint('showAccount()');
if (!$this->account) {
print "";
print _("Error: SIP Account information cannot be retrieved. ");
return 0;
print " | ";
}
print "
";
$this->showHeader();
$this->chapterTableStart();
$this->showAboveTabs();
$this->showTabs();
$this->showUnderTabs();
$this->showTitleBar();
if (!array_key_exists($this->tab,$this->tabs)) $this->tab="settings";
// show tab
$tabFunctionName='show'.ucfirst($this->tab).'Tab';
$this->$tabFunctionName();
$this->showFooter();
$this->chapterTableStop();
}
function getDomainOwner ($domain='') {
dprint("getdomainOwner($domain)");
if (!$domain) return;
// Filter
$filter=array('domain' => $domain);
// Range
$range=array('start' => 0,
'count' => 1
);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
//dprint_r($Query);
// Call function
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getDomains($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
if ($result->domains[0]) {
$this->reseller = $result->domains[0]->reseller;
$this->customer = $result->domains[0]->customer;
}
}
}
function getMobileNumber() {
//dprint('getMobileNumber()');
$this->mobile_number='';
if ($this->Preferences['mobile_number']) {
$this->mobile_number=$this->Preferences['mobile_number'];
} else if ($this->owner_information['mobile']) {
$this->mobile_number=$this->owner_information['mobile'];
}
}
function setLanguage() {
dprint("setLanguage()");
if ($this->login_type == 'reseller' || $this->login_type == 'customer') {
$lang = $this->ResellerLanguage;
} else if ($this->login_type == 'subscriber') {
if (!$this->Preferences['language']) {
foreach (array_keys($this->languages) as $_lang) {
if ($this->languages[$_lang]['timezone'] == $this->timezone) {
$lang=$_lang;
break;
}
}
}
$lang = $this->Preferences['language'];
} else {
$lang = "en";
}
//print("Set language to $lang");
$this->changeLanguage($lang);
}
function getOwnerSettings($owner='') {
dprint("getOwnerSettings($owner)");
if (!$owner) {
return false;
}
$this->CustomerPort->addHeader($this->SoapAuthCustomer);
$result = $this->CustomerPort->getAccount($owner);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
$this->owner_information=array(
"username" => $result->username,
"password" => $result->password,
"firstName" => $result->firstName,
"lastName" => $result->lastName,
"organization" => $result->organization,
"timezone" => $result->timezone,
"address" => $result->address,
"billingAddress" => $result->billingAddress,
"city" => $result->city,
"state" => $result->state,
"country" => $result->country,
"postcode" => $result->postcode,
"tel" => $result->tel,
"enum" => $result->enum,
"mobile" => $result->mobile,
"fax" => $result->fax,
"email" => $result->email,
"web" => $result->web
);
//dprint_r($this->owner_information);
}
function getAliases() {
// Get Aliases
dprint("getAliases()");
$this->aliases=array();
$this->SipPort->addHeader($this->SoapAuth);
// Filter
$filter=array('targetUsername' => $this->username,
'targetDomain' => $this->domain
);
// Range
$range=array('start' => 0,
'count' => 20
);
// Order
$orderBy = array('attribute' => 'aliasUsername',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$result = $this->SipPort->getAliases($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
//dprint_r($result);
foreach ($result->aliases as $_alias) {
$this->aliases[]=$_alias->id->username.'@'.$_alias->id->domain;
}
}
function getRatingEntityProfiles() {
dprint("getRatingEntityProfiles()");
$this->EntityProfiles=array();
$this->RatingPort->addHeader($this->SoapAuthRating);
$entity="subscriber://".$this->username."@".$this->domain;
$result = $this->RatingPort->getEntityProfiles($entiry);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (RatingPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
$this->EntityProfiles=$result;
}
function setAliases() {
dprint("setAliases()");
$aliases_new=$_REQUEST['aliases'];
$this->getAliases();
$aliases_old=$this->aliases;
$addAliases = array_unique(array_diff($aliases_new,$aliases_old));
$deleteAliases = array_unique(array_diff($aliases_old,$aliases_new));
foreach ($addAliases as $_alias) {
$_alias=trim(strtolower($_alias));
if (!preg_match("/^[a-z0-9-_.@]+$/i",$_alias)) continue;
$els=explode("@",$_alias);
if (count($els) ==1 ) {
$_alias_username=$_alias;
$_alias_domain=$this->domain;
} else if (count($els) ==2) {
$_alias_username=$els[0];
$_alias_domain=$this->domain;
} else {
continue ;
}
$_aliasObject=array("id"=>array("username"=>strtolower($_alias_username),
"domain"=>strtolower($_alias_domain)
),
"owner"=>intval($this->owner),
"target"=>$this->sipId
)
;
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->addAlias($_aliasObject);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
foreach ($deleteAliases as $_alias) {
$_alias=trim($_alias);
if (!strlen($_alias)) continue;
$els=explode("@",$_alias);
if (count($els) ==1 ) {
$_alias_username=$_alias;
$_alias_domain=$this->domain;
} else if (count($els) == 2) {
$_alias_username=$els[0];
$_alias_domain=$els[1];
} else {
continue ;
}
$_aliasObject=array("username"=>$_alias_username,
"domain" =>$_alias_domain
);
dprint_r($_aliasObject);
dprint("deleteAlias");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->deleteAlias($_aliasObject);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
unset($this->aliases);
}
function getVoicemail () {
dprint("getVoicemail()");
$this->VoicemailPort->addHeader($this->SoapAuthVoicemail);
$result = $this->VoicemailPort->getAccount($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "2000" && $error_fault->detail->exception->errorcode != "1010") {
printf (" Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
return true;
}
}
if (!$result->mailbox) {
dprint ("No voicemail account found");
return false;
}
$this->voicemail['Mailbox'] = $result->mailbox;
$this->voicemail['Password'] = $result->password;
$this->voicemail['Name'] = $result->name;
$this->voicemail['Email'] = $result->email;
$this->voicemail['Info'] = $result->info;
$this->voicemail['Options'] = $result->options;
$this->voicemail['Account'] = $result->mailbox.'@'.$this->voicemail_server;
// used by template system
$this->voicemailMailbox = $result->mailbox;
//dprint_r($this->voicemail);
return true;
}
function showTitleBar() {
print "
";
printf (("%s <sip:%s@%s>"),$this->fullName,$this->username,$this->domain);
print "
";
if ($this->login_type == 'subscriber' && !$this->isEmbedded()) {
print "";
print _("Logout");
print "";
} else {
if ($this->enable_thor) {
print " ";
if ($this->isEmbedded()) {
print " ";
print _("Home Node");
} else {
print "";
print _("SIP Thor Node");
print "";
}
if ($this->homeNode=getSipThorHomeNode($this->account,$this->sip_proxy)) {
printf (" %s",$this->homeNode);
} else {
print " ";
print _("Unknown");
print "";
}
}
}
print "
";
}
function getDivertTargets () {
dprint("getDivertTargets()");
$this->divertTargets[] = array("name" => _("No diversion"),
"value" => "",
"description" => "Disabled"
);
if ($this->voicemail['Account']) {
$vmf=$this->getVoicemailForwarding();
if (is_array($vmf)) {
$this->divertTargets[]=$vmf;
}
}
if ($this->owner) {
if (in_array("free-pstn",$this->groups)) {
if ($this->owner_information['tel']) {
$tel = preg_replace("/[^\d+]/", "", $this->owner_information['tel']);
$tel_enum = str_replace("+", "00", $tel);
$telf = $tel_enum . "@" . $this->domain;
if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) {
$this->divertTargets[]=array("name" => sprintf (_("Tel %s"),$tel),
"value" => $telf,
"description" => "Tel");
}
$seen[$tel_enum]++;
}
if ($this->owner_information['enum']) {
$tel = preg_replace("/[^\d+]/", "", $this->owner_information['enum']);
$tel_enum = str_replace("+", "00", $tel);
$telf = $tel_enum . "@" . $this->domain;
if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) {
$this->divertTargets[]=array("name" => sprintf (_("Tel %s"),$tel),
"value" => $telf,
"description" => "ENUM");
}
$seen[$tel_enum]++;
}
}
}
if ($this->mobile_number) {
$tel = preg_replace("/[^\d+]/", "", $this->mobile_number);
$tel_enum = str_replace("+", "00", $tel);
$telf = $tel_enum . "@" . $this->domain;
if (!$seen[$tel_enum] && !in_array($tel_enum,$this->enums)) {
$this->divertTargets[] = array("name" => sprintf (_("Mobile %s"),$tel),
"value" => $telf,
"description" => "Mobile"
);
}
$seen[$tel_enum]++;
}
$this->divertTargets[]=array("name" => sprintf (_("Other")),
"value" => "",
"description" => "Other"
);
//print_r($this->divertTargets);
}
function pstnChangesAllowed() {
dprint("pstnChangesAllowed()");
if ($this->login_type == 'subscriber') {
$this->pstn_changes_allowed = false;
return;
} else {
if ($this->login_type == 'admin') {
$this->pstn_changes_allowed = true;
return;
// for a reseller we need to check if a subaccount is allowed
} else if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) {
if ($this->resellerProperties['pstn_changes']) {
dprint("is reseller");
$this->pstn_changes_allowed = true;
}
return;
} else if ($this->customerImpersonate == $this->loginCredentials['reseller']) {
if ($this->resellerProperties['pstn_changes']) {
dprint("impersonate reseller");
$this->pstn_changes_allowed = true;
}
return;
} else if ($this->resellerProperties['pstn_changes'] && $this->customerProperties['pstn_changes']) {
$this->pstn_changes_allowed = true;
return;
}
}
$this->pstn_changes_allowed = false;
return;
}
function smsChangesAllowed() {
dprint("smsChangesAllowed()");
if ($this->login_type == 'subscriber') {
$this->sms_changes_allowed = false;
return;
} else {
// for a reseller we need to check if a subaccount is allowed
if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) {
if ($this->resellerProperties['sms_access']) {
dprint("is reseller");
$this->sms_changes_allowed = true;
}
return;
} else if ($this->customerImpersonate == $this->loginCredentials['reseller']) {
if ($this->resellerProperties['sms_access']) {
dprint("impersonate reseller");
$this->sms_changes_allowed = true;
}
return;
} else if ($this->resellerProperties['sms_access'] && $this->customerProperties['sms_access']) {
$this->sms_changes_allowed = true;
return;
}
}
$this->sms_changes_allowed = false;
return;
}
function prepaidChangesAllowed() {
dprint("prepaidChangesAllowed()");
if ($this->login_type == 'subscriber') {
$this->prepaid_changes_allowed = false;
return;
} else {
if ($this->login_type == 'admin') {
$this->prepaid_changes_allowed = true;
return;
// for a reseller we need to check if a subaccount is allowed
} else if ($this->loginCredentials['customer'] == $this->loginCredentials['reseller']) {
dprint("is reseller");
if ($this->resellerProperties['prepaid_changes']) {
$this->prepaid_changes_allowed = true;
}
return;
} else if ($this->customerImpersonate == $this->loginCredentials['reseller']) {
dprint("impersonate reseller");
if ($this->resellerProperties['prepaid_changes']) {
$this->prepaid_changes_allowed = true;
}
return;
} else if ($this->resellerProperties['prepaid_changes'] && $this->customerProperties['prepaid_changes']) {
$this->prepaid_changes_allowed = true;
return;
}
}
$this->prepaid_changes_allowed = false;
return;
}
function getCustomerSettings () {
dprint("getCustomerSettings()");
if (!$this->loginCredentials['customer']) return;
$id=$this->loginCredentials['customer'];
$this->CustomerPort->addHeader($this->SoapAuthCustomer);
$result = $this->CustomerPort->getAccount(intval($this->loginCredentials['customer']));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
foreach ($result->properties as $_property) {
$this->customerProperties[$_property->name]=$_property->value;
}
$this->customerImpersonate=$result->impersonate;
//dprint_r($this->customerProperties);
}
function getResellerSettings () {
dprint("getResellerSettings()");
$this->logoFile = $this->getFileTemplate("logo","logo");
$this->headerFile = $this->getFileTemplate("header.phtml");
$this->footerFile = $this->getFileTemplate("footer.phtml");
$this->cssFile = $this->getFileTemplate("main.css");
if (!$this->reseller) {
if ($this->pstn_access) {
$this->availableGroups['free-pstn'] = array(
"Group" => "free-pstn",
"WEBName" => sprintf(_("PSTN Access")),
"WEBComment" => sprintf(_("Caller-ID")),
"SubscriberMayEditIt" => 0,
"SubscriberMaySeeIt" => 1,
"ResellerMayEditIt" => 1,
"ResellerMaySeeIt" => 1
);
if ($this->change_privacy_access_number) {
$_comment = sprintf(_("Dial %s to change"), $this->change_privacy_access_number);
} else {
$_comment = '';
}
$this->availableGroups['anonymous'] = array(
"Group" => "anonymous",
"WEBName" => sprintf (_("PSTN Privacy")),
"WEBComment" => $_comment,
"SubscriberMaySeeIt" => 1,
"SubscriberMayEditIt" => 1,
"ResellerMayEditIt" => 1,
"ResellerMaySeeIt" => 1
);
if ($this->pstn_access) {
$this->availableGroups['rate-on-net'] = array("Group"=>"rate-on-net",
"WEBName" =>sprintf(_("Rate on net")),
"SubscriberMayEditIt"=>0,
"SubscriberMaySeeIt"=>0,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
if ($this->sms_access) {
$this->availableGroups['sms'] = array("Group"=>"sms",
"WEBName" =>sprintf(_("Mobile SMS")),
"SubscriberMayEditIt"=>0,
"SubscriberMaySeeIt"=>1,
"ResellerMayEditIt"=>0,
"ResellerMaySeeIt"=>1
);
}
}
if ($this->require_proof_of_identity) {
$this->availableGroups['payments'] = array("Group"=>"payments",
"WEBName" =>sprintf(_("CC Payments")),
"SubscriberMayEditIt"=>0,
"SubscriberMaySeeIt"=>0,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
}
}
return true;
}
$this->CustomerPort->addHeader($this->SoapAuthCustomer);
$result = $this->CustomerPort->getAccount(intval($this->reseller));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (CustomerPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
foreach ($result->properties as $_property) {
$this->resellerProperties[$_property->name]=$_property->value;
}
$this->resellerProperties['language'] = $result->language;
$this->resellerProperties['timezone'] = $result->timezone;
// overwrite settings from soap engine
if ($this->resellerProperties['sip_proxy']) {
$this->sip_proxy = $this->resellerProperties['sip_proxy'];
}
+ if ($this->resellerProperties['sip_outbound_proxy']) {
+ $this->sip_outbound_proxy = $this->resellerProperties['sip_outbound_proxy'];
+ }
+
+ if ($this->resellerProperties['push_notifications_server']) {
+ $this->sip_mobile_outbound_proxy = $this->resellerProperties['push_notifications_server'];
+ }
+
+ if (!$this->sip_outbound_proxy) {
+ $this->sip_outbound_proxy = $this->sip_proxy;
+ }
+
+ if (!$this->sip_mobile_outbound_proxy) {
+ $this->sip_mobile_outbound_proxy = $this->sip_outbound_proxy;
+ }
+
if ($this->resellerProperties['store_clear_text_passwords']) {
$this->store_clear_text_passwords = $this->resellerProperties['store_clear_text_passwords'];
}
if ($this->resellerProperties['support_company']) {
$this->support_company = $this->resellerProperties['support_company'];
}
if ($this->resellerProperties['support_web']) {
$this->support_web = $this->resellerProperties['support_web'];
}
if ($this->resellerProperties['support_email']) {
$this->support_email = $this->resellerProperties['support_email'];
}
if ($this->resellerProperties['billing_email']) {
$this->billing_email = $this->resellerProperties['billing_email'];
}
if (!$this->billing_email) {
$this->billing_email=$this->support_email;
}
if ($this->resellerProperties['sip_settings_page']) {
$this->sip_settings_page = $this->resellerProperties['sip_settings_page'];
}
if ($this->resellerProperties['digest_settings_page']) {
$this->digest_settings_page = $this->resellerProperties['digest_settings_page'];
}
if ($this->resellerProperties['xcap_root']) {
$this->xcap_root = rtrim($this->resellerProperties['xcap_root'],'/');
if ($this->append_domain_to_xcap_root) {
$this->xcap_root .= "@".$this->domain."/";
}
}
if ($this->resellerProperties['cdrtool_address']) {
$this->cdrtool_address = $this->resellerProperties['cdrtool_address'];
}
if ($this->resellerProperties['msrp_relay']) {
$this->msrp_relay = $this->resellerProperties['msrp_relay'];
}
if (isset($this->resellerProperties['voicemail_server'])) {
$this->voicemail_server = $this->resellerProperties['voicemail_server'];
}
if (isset($this->resellerProperties['voicemail_access_number'])) {
$this->voicemail_access_number = $this->resellerProperties['voicemail_access_number'];
}
if (isset($this->resellerProperties['currency'])) {
$this->currency = $this->resellerProperties['currency'];
}
if (isset($this->resellerProperties['FUNC_access_number'])) {
$this->FUNC_access_number = $this->resellerProperties['FUNC_access_number'];
}
if (isset($this->resellerProperties['FNOA_access_number'])) {
$this->FNOA_access_number = $this->resellerProperties['FNOA_access_number'];
}
if (isset($this->resellerProperties['FBUS_access_number'])) {
$this->FBUS_access_number = $this->resellerProperties['FBUS_access_number'];
}
if (isset($this->resellerProperties['FNOL_access_number'])) {
$this->FNOL_access_number = $this->resellerProperties['FNOL_access_number'];
}
if (isset($this->resellerProperties['payment_processor_class'])) {
$this->payment_processor_class = $this->resellerProperties['payment_processor_class'];
}
if (isset($this->resellerProperties['change_privacy_access_number'])) {
$this->change_privacy_access_number = $this->resellerProperties['change_privacy_access_number'];
}
if (isset($this->resellerProperties['check_privacy_access_number'])) {
$this->check_privacy_access_number = $this->resellerProperties['check_privacy_access_number'];
}
if (isset($this->resellerProperties['reject_anonymous_access_number'])) {
$this->reject_anonymous_access_number = $this->resellerProperties['reject_anonymous_access_number'];
}
if (isset($this->resellerProperties['absolute_voicemail_uri'])) {
$this->absolute_voicemail_uri = $this->resellerProperties['absolute_voicemail_uri'];
}
if (isset($this->resellerProperties['pstn_access'])) {
$this->pstn_access = $this->resellerProperties['pstn_access'];
}
if (isset($this->resellerProperties['sms_access'])) {
$this->sms_access = $this->resellerProperties['sms_access'];
}
if ($this->pstn_access) {
$this->availableGroups['free-pstn'] = array("Group"=>"free-pstn",
"WEBName" => sprintf(_("PSTN Access")),
"WEBComment"=> sprintf(_("Caller-ID")),
"SubscriberMayEditIt" => "0",
"SubscriberMaySeeIt" => 1,
"ResellerMayEditIt"=>1,
"ResellerMaySeeIt"=>1
);
if ($this->change_privacy_access_number) {
$_comment = sprintf(_("Dial %s to change"), $this->change_privacy_access_number);
} else {
$_comment = '';
}
$this->availableGroups['anonymous'] = array(
"Group" => "anonymous",
"WEBName" => sprintf (_("PSTN Privacy")),
"WEBComment" => $_comment,
"SubscriberMaySeeIt" => 1,
"SubscriberMayEditIt" => 1,
"ResellerMayEditIt" => 1,
"ResellerMaySeeIt" => 1
);
$this->availableGroups['rate-on-net'] = array(
"Group" => "rate-on-net",
"WEBName" => sprintf(_("Rate on net")),
"SubscriberMayEditIt" => 0,
"SubscriberMaySeeIt" => 0,
"ResellerMayEditIt" => 1,
"ResellerMaySeeIt" => 1
);
if ($this->sms_access) {
$this->availableGroups['sms'] = array("Group"=>"sms",
"WEBName" =>sprintf(_("Mobile SMS")),
"SubscriberMayEditIt"=>0,
"SubscriberMaySeeIt"=>1,
"ResellerMayEditIt"=>0,
"ResellerMaySeeIt"=>1
);
}
}
}
function getDiversions() {
dprint("getDiversions()");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getCallDiversions($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
//print_r($result);
reset($this->diversionType);
foreach(array_keys($this->diversionType) as $condition) {
$uri=$result->$condition;
if (($uri == "" || $uri == "voice-mailbox") && $this->absolute_voicemail_uri) {
$uri = $this->voicemail['Account'];
} else if ($uri == "voice-mailbox") {
$uri = "";
}
if (preg_match("/^(sip:|sips:)(.*)$/i",$uri,$m)) {
$uri=$m[2];
}
$this->diversions[$condition]=$uri;
}
//print_r($this->diversions);
}
function getDeviceLocations() {
dprint("getDeviceLocations()");
require_once($this->SipUAImagesFile);
$this->userAgentImages = $userAgentImages;
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getSipDeviceLocations(array($this->sipId));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
foreach ($result[0]->locations as $locationStructure) {
$contact=$locationStructure->address.":".$locationStructure->port;
if ($locationStructure->publicAddress) {
$publicContact=$locationStructure->publicAddress.":".$locationStructure->publicPort;
} else {
$publicContact=$contact;
}
$this->locations[]=array("contact" => $contact,
"publicContact" => $publicContact,
"expires" => $locationStructure->expires,
"user_agent" => $locationStructure->userAgent,
"transport" => $locationStructure->transport
);
}
}
}
function getVoicemailForwarding () {
dprint("getVoicemailForwarding()");
if (!$this->voicemail['Account']) {
return;
}
if ($this->absolute_voicemail_uri) {
$value=$this->voicemail['Account'];
} else {
$value="";
}
return array("name" => sprintf (_("Voice Mailbox")),
"value" => $value,
"description" => "Voicemail");
}
function showAboveTabs() {
print "
";
}
function showTabs() {
print "";
if ($this->isEmbedded()) {
print $this->embedded_img;;
}
print "
";
$items=0;
while (list($k,$v)= each($this->tabs)) {
if ($this->tab==$k) {
$_class='active selected_tab';
} else {
$_class='tabs';
}
print "
- $v
";
}
print "
";
print " ";
}
function showUnderTabs() {
print "
";
print "
";
}
function addInvoice($cardProcessor) {
// called after CC payment sucessfull
}
function showPaymentsTab() {
if (!$this->show_payments_tab) {
return false;
}
if ($this->login_type == 'subscriber' && in_array("blocked",$this->groups)) {
return false;
}
if ($_REQUEST['task'] == 'showprices') {
$chapter=sprintf(_("Price list"));
$this->showChapter($chapter);
include($this->pstn_termination_price_page);
return true;
}
$chapter=sprintf(_("Payments"));
$this->showChapter($chapter);
if (!$this->owner) {
print "
";
print _("You must set the Owner to enable Credit Card Payments. ");
print "
|
";
return false;
}
$this->getBalanceHistory();
$today_summary = $this->getTodayBalanceSummary();
if ($today_summary['credit'] >= $this->max_credit_per_day) {
print "
";
if ($account->login_type!='subscriber') {
print " ";
printf ("Daily Credit Exceeded");
} else {
print _("Page Not Available");
$log=sprintf("CC transaction is not allowed from %s for %s (%s)",$_SERVER['REMOTE_ADDR'],$account->account,$this->fraud_reason);
syslog(LOG_NOTICE, $log);
}
print " |
";
return false;
}
if (!count($this->balance_history)) {
$this->first_transaction=true;
} else {
$this->first_transaction=false;
}
print "
";
print " ";
printf (_("Calling to telephone numbers is possible at the costs set forth in the Price List. "),$this->url);
//printf (_("You can purchase credit with a Credit Card or Bitcoin. "),$this->url, $this->url);
//print " ";
//printf (_("You can purchase credit using Bitcoin. "), $this->url);
print "
";
print "
|
";
$credit_amount = 20;
//$method = 'btc';
if ($method == 'btc') {
print "Select an amount and click submit to go the Bitcoin payment page.";
printf("
Amount USD
", $this->account);
} else {
$chapter=sprintf(_("Credit Card"));
$this->showChapter($chapter);
if ($this->require_proof_of_identity) {
if ($this->login_type == 'subscriber') {
if (!in_array("payments",$this->groups)) {
$this->showIdentityProof();
}
} else {
$this->showIdentityProof();
}
if (!in_array("payments",$this->groups)) {
return false;
}
}
$payment_processor = new $this->payment_processor_class($this);
if ($payment_processor->fraudDetected()) {
$chapter=sprintf(_("Payments"));
$this->showChapter($chapter);
print "
";
if ($account->login_type!='subscriber') {
print " ";
printf ("%s",$this->fraud_reason);
} else {
print _("Page Not Available");
$log=sprintf("CC transaction is not allowed from %s for %s (%s)",$_SERVER['REMOTE_ADDR'],$account->account,$this->fraud_reason);
syslog(LOG_NOTICE, $log);
}
print " |
";
return false;
}
$basket = array('pstn_credit'=>array('price' => $credit_amount,
'description' => _('Prepaid Credit'),
'unit' => 'credit',
'duration' => 'N/A',
'qty' => 1
)
);
// print "";
// print_r($payment_processor);
// print " ";
$payment_processor->doDirectPayment($basket);
//print "";
//
//print_r($payment_processor);
//print " ";
if ($payment_processor->transaction_results['success']) {
// add PSTN credit
$this->addBalanceReseller($credit_amount,sprintf("CC transaction %s",$payment_processor->transaction_results['id']));
}
if ($this->first_transaction && $payment_processor->make_credit_checks) {
// block account temporary to check the user
// $transaction_data= $payment_processor->['CardProcessor']['transaction_data'];
// if ( $this->email != $transaction_data['USER_EMAIL'] ||
// $this->
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->removeFromGroup(array("username" => $this->username,"domain"=> $this->domain),"free-pstn");
}
}
}
function showIdentityProof () {
$max_file_size=1024000;
$this->db = new DB_CDRTool();
$chapter=sprintf(_("Proof of Identity"));
$this->showChapter($chapter);
if ($_REQUEST['task'] == 'upload') {
if (!$_FILES['tmpfile']['tmp_name']) {
print "";
printf (_("Error: Please specify a file"));
print "";
} else if (!$_REQUEST['name']) {
print "";
printf (_("Error: Please enter the name printed on the Credit Card"));
print "";
} else if (!preg_match("/^\d{4}$/",$_REQUEST['last_digits'])) {
print "";
printf (_("Error: Last digits must be numeric"));
print "";
} else if (!preg_match("/^\+[1-9][0-9]{7,14}$/",$_REQUEST['mobile_number'])) {
print "";
printf (_("Error: Mobile Number must be in international format starting with +"));
print "";
} else if ($_FILES['tmpfile']['size']['size'] > $max_file_size) {
print "";
printf (_("Error: Maximum file size is %s"),$max_file_size);
print "";
} else {
$fp=fopen($_FILES['tmpfile']['tmp_name'], "r");
$content=fread($fp, $_FILES['tmpfile']['size']);
fclose($fp);
$query=sprintf("insert into subscriber_docs (
`name`,
`username`,
`domain`,
`document`,
`file_content`,
`file_name`,
`file_size`,
`file_type`,
`file_date`,
`last_digits`,
`mobile_number`
) values (
'%s',
'%s',
'%s',
'identity',
'%s',
'%s',
'%s',
'%s',
NOW(),
'%s',
'%s'
)",
addslashes($_REQUEST['name']),
addslashes($this->username),
addslashes($this->domain),
addslashes($content),
addslashes($_FILES['tmpfile']['name']),
addslashes($_FILES['tmpfile']['size']),
addslashes($_FILES['tmpfile']['type']),
addslashes($_REQUEST['last_digits']),
addslashes($_REQUEST['mobile_number'])
);
if (!$this->db->query($query)) {
print "";
printf ("Error: Failed to save identity document %s (%s)", $this->db->Error,$this->db->Errno);
print "";
}
// send mail
include_once('Mail.php');
include_once('Mail/mime.php');
$subject=sprintf ("%s requested CC Payments",$this->account);
$hdrs = array(
'From' => $this->email,
'Subject' => $subject
);
$crlf = "\n";
$mime = new Mail_mime($crlf);
$mime->setTXTBody($subject);
$mime->setHTMLBody($subject);
$mime->addAttachment($content, $_FILES['tmpfile']['type'],$_FILES['tmpfile']['name'],'false');
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
$mail->send($this->billing_email, $hdrs, $body);
}
}
if ($this->login_type != 'subscriber' && $_REQUEST['task'] == 'delete_identity_proof' && $_REQUEST['confirm']) {
$query=sprintf("delete from subscriber_docs
where username = '%s'
and domain = '%s'
and document = 'identity'",
addslashes($this->username),
addslashes($this->domain)
);
if (!$this->db->query($query)) {
print "";
printf ("Error deleting record: %s (%s)", $this->db->Error,$this->db->Errno);
print "";
}
}
$query=sprintf("select * from subscriber_docs
where username = '%s'
and domain = '%s'
and document = 'identity'",
addslashes($this->username),
addslashes($this->domain)
);
if (!$this->db->query($query)) {
print "";
printf ("Error for database query: %s (%s)", $this->db->Error,$this->db->Errno);
print "";
}
if ($this->db->num_rows()) {
print "
";
if (!in_array("payments",$this->groups)) {
print "";
print _("Credit Card payments will be activated after your identity is verified. ");
}
printf (" %s | %s | %s | %s | %s | %s | %s | ",
_("Name"),
_("Document"),
_("Type"),
_("Size"),
_("Date"),
_("Last digits"),
_("Mobile Number")
);
if ($this->login_type != 'subscriber') {
print "";
print _("Actions");
print " | ";
}
printf (" ");
$this->db->next_record();
$download_url=$this->url.'&action=export_identity_proof';
printf (" %s | %s | %s | %s KB | %s | %s | %s | ",
$this->db->f('name'),
$download_url,
$this->db->f('file_name'),
$this->db->f('file_type'),
number_format($this->db->f('file_size')/1024,2),
$this->db->f('file_date'),
$this->db->f('last_digits'),
$this->db->f('mobile_number')
);
if ($this->login_type != 'subscriber') {
if ($_REQUEST['task'] == 'delete_identity_proof' && !$_REQUEST['confirm']){
$delete_url=$this->url.'&tab=payments&task=delete_identity_proof&confirm=1';
printf ("%s | ",$delete_url,_("Confirm"));
} else {
$delete_url=$this->url.'&tab=payments&task=delete_identity_proof';
printf ("%s | ",$delete_url,$this->delete_img);
}
}
printf (" ");
print "
";
} else {
print "
";
print " ";
print _("Credit Card payments are available only to verified customers. ");
print " ";
printf (_("To become verified, upload a copy of your passport or driving license that matches the Credit Card owner. "),$this->billing_email, $this->account, $this->billing_email);
print " ";
printf (_("This copy will be kept on your profile until the credit card transaction has been approved. "));
print "
";
print "
url method='post' enctype='multipart/form-data'>
";
print "
";
}
}
function exportIdentityProof() {
$this->db = new DB_CDRTool();
$query=sprintf("select * from subscriber_docs
where username = '%s'
and domain = '%s'
and document = 'identity'",
addslashes($this->username),
addslashes($this->domain)
);
if (!$this->db->query($query)) {
print "";
printf ("Error for database query: %s (%s)", $this->db->Error,$this->db->Errno);
print "";
}
if ($this->db->num_rows()) {
$this->db->next_record();
$h=sprintf("Content-type: %s",$this->db->f('file_type'));
Header($h);
$h=sprintf("Content-Disposition: attachment; filename=%s",$this->db->f('file_name'));
Header($h);
$h=sprintf("Content-Length: %s",$this->db->f('file_size'));
Header($h);
$this->db->p('file_content');
}
}
function showIdentityTab() {
$this->getEnumMappings();
$this->getAliases();
$chapter=sprintf(_("SIP Account"));
$this->showChapter($chapter);
print "
";
print _("SIP Address");
print " |
sip:$this->account |
";
/*
print "
";
print _("Full Name");
print "
|
$this->fullName
|
";
*/
print "
";
print _("Username");
print " |
$this->username |
";
print "
";
print _("Domain/Realm");
print " |
$this->domain |
";
print "
";
- print _("Outbound Proxy");
+ if (in_array("mobile",$this->groups)) {
+ print _("Push Outbound Proxy");
+ $ob = $this->sip_mobile_outbound_proxy;
+ } else {
+ print _("Outbound Proxy");
+ $ob = $this->sip_outbound_proxy;
+ }
print " |
- $this->sip_proxy |
+ $ob |
";
if ($this->xcap_root) {
print "
";
print _("XCAP Root");
print "
|
$this->xcap_root
|
";
}
print " ";
if ($this->pstn_access && $this->rpid) {
$chapter=sprintf(_("PSTN"));
$this->showChapter($chapter);
print "
";
print _("Caller-ID");
print " |
$this->rpid |
";
$t=0;
foreach($this->enums as $e) {
$t++;
$rr=floor($t/2);
$mod=$t-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
print "
";
print _("Phone Number");
print " |
$e |
";
}
print "
";
}
$chapter=sprintf(_("Aliases"));
$this->showChapter($chapter);
print "
";
printf (_("You may create new aliases for incoming calls"));
printf ("
");
$t=0;
print "
";
foreach($this->aliases as $a) {
$t++;
$rr=floor($t/2);
$mod=$t-$rr*2;
if ($mod ==0) {
$_class='even';
} else {
$_class='odd';
}
print "
";
}
print "
';
print $this->hiddenElements;
print "
";
if (!$this->isEmbedded() && $this->show_tls_section) {
if ($this->enrollment_url) {
include($this->enrollment_configuration);
if (is_array($enrollment)) {
$chapter=sprintf(_("TLS Certificate"));
$this->showChapter($chapter);
print "
";
print _("X.509 Format");
printf ("
|
Certificate
|
",$this->url);
/*
print "
";
print _("PKCS#12 store format");
printf ("
|
Certificate
|
|
",$this->url);
*/
}
}
}
print "
";
print "
";
if ($this->email) {
printf (_("Email SIP Account information to %s"),$this->email);
print "
";
}
if ($this->sip_settings_page && $this->login_type != 'subscriber') {
print " ";
printf (_("Login using SIP credentials at %s"),$this->sip_settings_page,$this->sip_settings_page);
print " ";
}
print $this->hiddenElements;
print "
";
if($this->sip_settings_page) {
$this->getbalancehistory();
if (count($this->balance_history) == "0" || $this->login_type != 'subscriber') {
print "";
print "";
$date1= new datetime($this->Preferences['account_delete_request']);
$today= new datetime('now');
if ($this->Preferences['account_delete_request'] && $this->login_type != 'subscriber' ) {
print " User made a deletion request on: ";
print $this->Preferences['account_delete_request'];
print " ";
}
if ($date1->diff($today)->d >= '2' || $this->Preferences['account_delete_request'] == '' || $this->login_type != 'subscriber' ) {
print ' ";
}
print $this->hiddenElements;
print "
";
}
}
function showDownloadTab() {
$chapter=sprintf(_("SIP Client download"));
$this->showChapter($chapter);
print "
";
$this->render_download_applet();
print "
|
";
}
function showDIDTab() {
if (class_exists($this->did_processor_class)) {
$did_processor = new $this->did_processor_class();
}
if (!$_REQUEST['ddi_action']) {
$chapter=sprintf(_("Registered Numbers"));
$this->showChapter($chapter);
print "
";
$numbers=$did_processor->getOrders($this->account);
if (count($numbers)) {
print "";
printf ("Number | Country | Expire Date | Order | Action | ");
foreach (array_keys($numbers) as $_number) {
$t++;
$rr=floor($t/2);
$mod=$t-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
$form=sprintf("
";
$form.=$this->hiddenElements;
$form.=sprintf ("",$_number);
$form.=sprintf ("");
$form.=sprintf ("");
printf ("+%s | %s | %s | %s | %s | ",$_number,$numbers[$_number]['country_name'],$numbers[$_number]['did_expire_date_gmt'],$numbers[$_number]['order_id'],$form);
}
print " ";
}
print "
|
";
}
if ($prefixes = $did_processor->getPrefixes()) {
if ($_REQUEST['ddi_action'] == 'register' && $_REQUEST['prefix'] && $_REQUEST['period']) {
$chapter=sprintf(_("Register New Number"));
$this->showChapter($chapter);
print "
";
$total=$prefixes[$_REQUEST['prefix']]['setup']+$prefixes[$_REQUEST['prefix']]['monthly']* $_REQUEST['period'];
$basket = array('ddi_number' => array('price' => sprintf("%.2f",$total),
'description' => sprintf(_('Telephone Number (+%s %s) for %d months'),$_REQUEST['prefix'],$prefixes[$_REQUEST['prefix']]['country_name'],$_REQUEST['period']),
'unit' => 'number',
'duration' => 'N/A',
'qty' => 1
)
);
$this->hiddenElements=sprintf("
",
$_REQUEST['prefix'],
$_REQUEST['period']
);
$data=array('customer_id' => $this->owner,
'country_iso' => $prefixes[$_REQUEST['prefix']]['country_iso'],
'city_prefix' => $prefixes[$_REQUEST['prefix']]['city_prefix'],
'period' => $_REQUEST['period'],
'map_data' => array(
'map_type' => 'URI',
'map_proto' => 'SIP',
'map_detail' => $this->account,
'map_pref_server' => 1
),
'prepaid_funds' => "0",
'uniq_hash' => md5(mt_rand())
);
$did_processor->createOrder($data);
/*
if (class_exists($this->payment_processor_class)) {
$payment_processor = new $this->payment_processor_class($this,$basket);
}
if ($payment_processor->transaction_results['success']) {
if ($did_processor->createOrder($data)) {
// add ENUM entry
} else {
// notify admin about payment without service fullfilment
}
}
*/
print "
|
";
} else if ($_REQUEST['ddi_action'] == 'Renew' && $_REQUEST['number'] && $_REQUEST['period']) {
$chapter=sprintf(_("Renew Number"));
$this->showChapter($chapter);
print "
";
$data=array('customer_id' => $this->owner,
'did_number' => $_REQUEST['number'],
'period' => $_REQUEST['period'],
'uniq_hash' => md5(mt_rand())
);
print "Renewing number....";
$did_processor->renewOrder($data);
print "
|
";
} else if ($_REQUEST['ddi_action'] == 'Drop' && $_REQUEST['number']) {
$chapter=sprintf(_("Cancel Number"));
$this->showChapter($chapter);
print "
";
$data=array('customer_id' => $this->owner,
'did_number' => $_REQUEST['number']
);
$did_processor->cancelOrder($data);
print "
|
";
} else {
$chapter=sprintf(_("Register New Number"));
$this->showChapter($chapter);
print "
";
print "
";
print _("Select a region where you want to have a telephone number: ");
print " ";
print "";
print " ";
print _("Select the duration for which you want to use the telephone number: ");
print " ";
print "";
print $this->hiddenElements;
print " ";
print "";
print "";
print "
";
}
print "
|
";
} else {
print "Error fetching DDI prefixes";
}
print "
";
}
function showSupportTab() {
$chapter=sprintf(_("Support"));
$this->showChapter($chapter);
print "
";
print " ";
printf (_("To request support you may send an e-mail to %s"),$this->support_email);
if ($this->support_web) {
print " ";
printf (_("For more information visit %s"),$this->support_web);
}
print "
|
";
}
function render_download_applet() {
$this->valid_os=array('nt','mac');
require("browser.php");
$os=browser_detection('os');
if ($this->create_certificate) {
if ($_passport = $this->generateCertificate()) {
$_account['passport'] = $_passport;
}
}
$_account['sip_address'] = $this->account;
$_account['display_name'] = sprintf("%s %s",$this->firstName,$this->lastName);
$_account['password'] = $this->password;
$_account['web_password'] = $this->Preferences['web_password'];
$_account['email'] = $this->email;
$_account['settings_url'] = $this->digest_settings_page;
$_account['xcap_root'] = $this->xcap_root;
$_account['outbound_proxy'] = $this->sip_proxy;
if ($this->enrollment_url) {
include($this->enrollment_configuration);
if (is_array($enrollment)) {
$_account['msrp_relay'] = $enrollment['msrp_relay'];
$_account['conference_server'] = $enrollment['conference_server'];
$_account['settings_url'] = $enrollment['settings_url'];
if ($enrollment['ldap_hostname']) {
$_account['ldap_hostname'] = $enrollment['ldap_hostname'];
}
if ($enrollment['ldap_dn']) {
$_account['ldap_dn'] = $enrollment['ldap_dn'];
}
}
}
if ($this->store_clear_text_passwords=='false') {
$match_password=false;
if ($_REQUEST['password']) {
$str=$this->result->id->username.":".$this->result->id->domain.":".$_REQUEST['password'];
if (md5($str) == $this->result->ha1) {
$_account['password']=$_REQUEST['password'];
$match_password=true;
}
}
if (!$match_password){
print "";
print _("Please enter your SIP account password: ");
if ($_REQUEST['password'] || $_REQUEST['continue']) {
print " ";
} else {
print " ";
}
print " ";
print " ";
print "";
if ($_REQUEST['password'] || $_REQUEST['continue']) {
print "Entered password does not match your account";
}
print " ";
print " ";
print " ";
print "";
print "";
print " ";
$class='hide';
}
}
print " ";
}
function showFooter() {
print "
";
if ($this->footerFile) {
include ("$this->footerFile");
} else {
print " ";
}
print "
";
}
function showSettingsTab() {
-
$use_yubikey=0;
if (stream_resolve_include_path('Auth/Yubico.php')) {
require_once 'Auth/Yubico.php';
$use_yubikey=1;
}
$this->getVoicemail();
print "
";
$chapter=sprintf(_("SIP Account"));
$this->showChapter($chapter);
if ($this->login_type != "subscriber" ) {
print "
";
print "
";
}
print "
";
print "
";
if ($use_yubikey == 1 && !$this->isEmbedded()) {
print "
";
//print '';
//print($this->Preferences['yubikey']);
//print_r($this);
//print ' ';
}
print "
";
print "
";
print "
";
$this->showTimezones('timezone',$this->timezone);
print " ";
$timestamp=time();
$LocalTime=getLocalTime($this->timezone,$timestamp);
print "";
print _("Local Time");
print ": $LocalTime";
//dprint_r($this->availableGroups);
print "
";
if (count($this->emergency_regions) > 0) {
print "
";
print "";
print "
";
}
if ($this->pstn_access) {
if (in_array("free-pstn",$this->groups)) {
if (in_array("quota",$this->groups)) {
$_class="alert alert-error";
} else {
$_class="";
}
if ($this->pstn_changes_allowed) {
print "
";
} else if ($this->quota) {
print "
";
printf ("%s %s ",$this->quota,$this->currency);
$this->getCallStatistics();
if ($this->thisMonth['price']) {
printf (_("This month usage: %.2f %s"),$this->thisMonth['price'], $this->currency);
printf (" / %d ",$this->thisMonth['calls']);
print _("Calls");
}
print "
";
}
}
if ($this->prepaid) $checked_box_prepaid="checked";
if (!$this->prepaid_changes_allowed) $disabled_box_prepaid = "disabled=true";
print "
";
}
foreach (array_keys($this->availableGroups) as $key) {
unset($disabled_box);
if ($this->login_type == 'subscriber' && !$this->availableGroups[$key]['SubscriberMaySeeIt']) {
continue;
}
if ($this->login_type == 'reseller' && !$this->availableGroups[$key]['ResellerMaySeeIt']) {
continue;
}
if (in_array($key,$this->groups)) {
$checked_box[$key]="checked";
}
$elementName = $this->availableGroups[$key]["WEBName"];
$elementComment = $this->availableGroups[$key]["WEBComment"];
if ($this->login_type == 'subscriber') {
if ($this->availableGroups[$key]['SubscriberMayEditIt']) {
$disabled_box = "";
} else {
$disabled_box = "disabled=true";
}
} elseif ($this->login_type == 'reseller') {
if ($this->availableGroups[$key]['ResellerMayEditIt']) {
$disabled_box = "";
} else {
$disabled_box = "disabled=true";
}
}
if ($key=="free-pstn" && !$this->pstn_changes_allowed) {
$disabled_box = "disabled=true";
}
if ($key=="blocked" && $checked_box[$key]) {
$_class="alert alert-error";
$_class1="error";
} else {
$_class="";
$_class1='';
}
print "
";
if ($key=="blocked") {
if ($this->Preferences['blocked_by']) {
$selected_blocked_by[$this->Preferences['blocked_by']]='selected';
} else if ($checked_box[$key]) {
$selected_blocked_by['reseller']='selected';
}
if ($this->login_type == 'admin' || $this->login_type == 'reseller') {
if ($this->customer != $this->reseller || $selected_blocked_by['customer']) {
printf ("
",
$key,
$selected_blocked_by['customer'],
_("Blocked by Customer"),
$this->customer,
$selected_blocked_by['reseller'],
_("Blocked by Reseller"),
$this->reseller
);
} else if ($this->reseller) {
printf ("
",
$key,
_("Active"),
$selected_blocked_by['reseller'],
_("Blocked by Reseller"),
$this->reseller
);
} else {
printf ("
",
$key,
_("Active"),
$selected_blocked_by['reseller'],
_("Blocked")
);
}
} else if ($this->login_type == 'customer' ) {
if (in_array($key,$this->groups)) {
if ($this->Preferences['blocked_by'] != 'reseller') {
printf ("
",
$key,
_("Active"),
$selected_blocked_by['customer'],
_("Blocked")
);
} else {
print _("Blocked by Reseller");
}
} else {
printf ("
",
$key,
_("Active"),
$selected_blocked_by['customer'],
_("Blocked")
);
}
} else {
if (in_array($key,$this->groups)) {
print _("Blocked");
} else {
print _("Active");
}
}
} else if ($key=="free-pstn") {
if ($this->pstn_changes_allowed) {
print " rpid\">";
} else {
print "";
} else {
print "$elementComment";
}
}
} else {
print "
";
}
print "
";
}
$this->showExtraGroups();
$this->showOwner();
$this->showQuickDial();
$this->showMobileNumber();
$this->showIPAccessList();
$this->showCallLimit();
print "
";
print "
";
$this->showVoicemail();
$this->showBillingProfiles();
$chapter=sprintf(_("Notifications Address"));
$this->showChapter($chapter);
print "
";
print "
";
print "
";
print "
";
print $this->hiddenElements;
print "
";
}
function showDiversionsTab () {
$this->getVoicemail();
$this->getEnumMappings();
$this->getDivertTargets();
$this->getDiversions();
print "
";
$chapter=sprintf(_("Call Forwarding"));
$this->showChapter($chapter);
$this->showDiversions();
print "
";
print "
";
print "
";
print $this->hiddenElements;
print "
";
}
function showVoicemail() {
if ($this->voicemail['Account']) {
$checked_voicemail="checked";
}
$chapter=sprintf(_("Voice Mailbox"));
$this->showChapter($chapter);
print "
";
if ($this->voicemail['Account']) {
print "
";
if ($this->voicemail['Options']->delete=="True") {
$checked_delete_voicemail="checked";
$selected_store_voicemail['email'] ="selected";
$selected_store_voicemail['server'] ="";
} else {
$selected_store_voicemail['email'] ="";
$selected_store_voicemail['server'] ="selected";
}
if (!$this->voicemail['DisableOptions']) {
print "";
} else {
printf (_("Voice messages are sent by email to %s"),$this->email);
}
print "
";
if (!$this->voicemail['DisableOptions']) {
print "
";
if ($this->voicemail_access_number) {
print "
";
printf(_("Dial %s to listen to your messages or change preferences. "),$this->voicemail_access_number);
print "
";
}
}
}
}
function showOwner() {
if ($this->login_type == 'subscriber') {
//print " owner\">";
return true;
}
print "
";
}
function showDevicesTab() {
$this->getDeviceLocations();
if (count($this->locations)) {
$chapter=sprintf(_("SIP Devices"));
$this->showChapter($chapter);
$j=0;
print "
";
foreach (array_keys($this->locations) as $location) {
$j++;
$contact = $this->locations[$location]['contact'];
$publicContact = $this->locations[$location]['publicContact'];
$expires = normalizeTime($this->locations[$location]['expires']);
$user_agent = $this->locations[$location]['user_agent'];
$transport = $this->locations[$location]['transport'];
$UAImage = $this->getImageForUserAgent($user_agent);
$rr=floor($j/2);
$mod=$j-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
print "";
printf ("",$this->SipUAImagesPath,$UAImage);
print " | ";
print "";
print "$user_agent";
if ($transport == 'tls') print " ";
print " ";
print _("Location");
print "";
print " ";
if (strlen($transport)) print "$transport:";
print "$contact ";
if ($publicContact != $contact) {
print " ($publicContact) ";
}
if ($publicContact) {
$_els=explode(":",$publicContact);
if ($_loc=geoip_record_by_name($_els[0])) {
$this->geo_location=$_loc['country_name'].'/'.utf8_encode($_loc['city']);
} else if ($_loc=geoip_country_name_by_name($_els[0])) {
$this->geo_location=$_loc;
} else {
$this->geo_location='';
}
printf ("%s",$this->geo_location);
}
print " | $expires | ";
print " ";
}
print " ";
}
}
function getBarringPrefixes() {
dprint("getBarringPrefixes()");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getBarringPrefixes($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
$this->barring_prefixes=$result;
return true;
}
function setBarringPrefixes() {
dprint("setBarringPrefixes");
$prefixes=array();
$barring_prefixes=$_REQUEST['barring_prefixes'];
foreach ($barring_prefixes as $_prefix) {
if (preg_match("/^\+[1-9][0-9]*$/",$_prefix)) {
$prefixes[]=$_prefix;
}
}
dprint("setBarringPrefixes");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setBarringPrefixes($this->sipId,$prefixes);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
function showBarringTab() {
$chapter=sprintf(_("Barred Destinations"));
$this->showChapter($chapter);
print "
";
print "
";
print _("You can deny outbound calls to unwanted PSTN prefixes. ");
print " ";
print "
";
if ($this->getBarringPrefixes()) {
foreach ($this->barring_prefixes as $_prefix) {
$found++;
$rr=floor($found/2);
$mod=$found-$rr*2;
if ($mod == 0) {
$_class='odd';
} else {
$_class='even';
}
print "
";
print " ";
print "
";
print " ";
}
}
print "
";
print "
";
print "
";
print $this->hiddenElements;
print "
";
}
function saveSettings() {
$this->getVoicemail();
/*
$this->getEnumMappings();
$this->getDivertTargets();
$this->getDiversions();
*/
$this->changedFields=array();
$this->sendCEmail=0;
foreach ($this->form_elements as $el) {
${$el} = $_REQUEST[$el];
}
$newACLarray = array();
$result = $this->result;
if (!is_array($result->properties)) $result->properties=array();
if (!is_array($result->groups)) $result->groups=array();
if ($mailto && $this->email != $mailto) {
$result->email=$mailto;
$this->email=$mailto;
$this->somethingChanged=1;
$this->voicemailOptionsHaveChanged=1;
$this->sendCEmail=1;
array_push($this->changedFields,"Email Address");
}
if ($this->login_type != "subscriber") {
if ($first_name && $this->firstName != $first_name) {
$result->firstName = $first_name;
$this->firstName = $first_name;
$this->somethingChanged=1;
$this->voicemailOptionsHaveChanged=1;
}
if ($last_name && $this->lastName != $last_name) {
$result->lastName = $last_name;
$this->lastName = $last_name;
$this->somethingChanged=1;
}
}
$this->properties=$result->properties;
$this->availableGroups['voicemail']=array("Group"=>"voicemail",
"WEBName" =>sprintf (_("Voice Mailbox")),
"SubscriberMayEditIt"=>"1",
"SubscriberMaySeeIt"=>0
);
if (!$this->voicemail['Account'] && $voicemail) {
if ($this->addVoicemail()) {
$this->setVoicemailDiversions();
$this->createdVoicemailnow=1;
}
} else if ($this->voicemail['Account'] && !$voicemail) {
if ($this->deleteVoicemail()) {
$this->voicemail['Account']="";
$this->removeVoicemailDiversions();
}
}
if ($this->pstn_changes_allowed) {
if (strcmp($quota,$this->quota) != 0) {
if (!$quota) $quota=0;
$result->quota=intval($quota);
dprint ("change the quota");
$this->somethingChanged=1;
}
if ($quota_deblock) {
$result->groups = array_unique(array_diff($this->groups,array('quota')));
$this->somethingChanged=1;
$this->SipPort->addHeader($this->SoapAuth);
$this->SipPort->removeFromGroup(array("username" => $this->username,"domain"=> $this->domain), "quota");
}
$rpid=trim($rpid);
if (strcmp($rpid,$this->rpid) != 0) {
dprint ("change the rpid");
$result->rpid=$rpid;
$this->somethingChanged=1;
}
if ($this->CallLimitChangePolicy()) {
if ($this->soapEngines[$this->sip_engine]['call_limit']) {
if (isset($callLimit) && $this->callLimit != $callLimit) {
$result->callLimit=intval($callLimit);
$this->somethingChanged=1;
}
}
}
}
$owner=intval($owner);
if ($owner != $this->owner && $this->login_type != 'subscriber') {
dprint ("change the owner");
$result->owner=$owner;
$this->somethingChanged=1;
} else {
$result->owner=$this->owner;
}
if ($this->prepaid_changes_allowed) {
if(!$result->prepaid && $_REQUEST['prepaid']){
if ($result->quota) {
$this->somethingChanged=1;
}
$this->somethingChanged=1;
} else if ($result->prepaid && !$_REQUEST['prepaid']) {
$this->somethingChanged=1;
}
$result->prepaid=intval($_REQUEST['prepaid']);
}
reset($this->availableGroups);
foreach (array_keys($this->availableGroups) as $key) {
// $val is set to 1 if web checkbox is ticked
$val = $_REQUEST[$key];
if ($this->login_type != 'subscriber' || $this->availableGroups[$key]['SubscriberMayEditIt']) {
if ($key == 'free-pstn') {
if (in_array($key,$this->groups) && !$val) {
if ($this->quota) {
// we save quota for later use when pstn access is re-granted
$this->somethingChanged=1;
$this->setPreference('last_sip_quota',"$this->quota");
}
$this->somethingChanged=1;
} else if (!in_array($key,$this->groups) && $val) {
if (!$this->prepaid_changes_allowed) {
$this->somethingChanged=1;
$result->prepaid=1;
}
}
if (!in_array($key,$this->groups) && $val) {
$this->setPreference('last_sip_quota',strval($this->quota));
$last_sip_quota=$this->Preferences['last_sip_quota'];
if ($last_sip_quota) {
$result->quota=intval($last_sip_quota);
$this->somethingChanged=1;
}
}
if ($this->pstn_changes_allowed) {
if ($val) $newACLarray[]=trim($key);
} else {
if (in_array($key,$this->groups)) {
$newACLarray[]=trim($key);
}
}
} else if ($key == 'blocked') {
if ($this->login_type == 'admin' || $this->login_type == 'reseller') {
if ($val && $val != $this->Preferences['blocked_by']) {
$this->setPreference('blocked_by',$val);
$this->somethingChanged=1;
} else if (!$val && in_array($key,$this->groups)) {
$this->somethingChanged=1;
$this->setPreference('blocked_by','');
}
if ($val) $newACLarray[]=trim($key);
} else if ($this->login_type == 'customer' ) {
if ($this->Preferences['blocked_by'] != 'reseller') {
if ($val && ($val != $this->Preferences['blocked_by'] || !in_array($key,$this->groups) )) {
$this->setPreference('blocked_by',$val);
$this->somethingChanged=1;
$newACLarray[]=trim($key);
} else if (!$val && in_array($key,$this->groups)) {
$this->somethingChanged=1;
$this->setPreference('blocked_by','');
}
if ($val) $newACLarray[]=trim($key);
} else {
// copy old setting if exists
if (in_array($key,$this->groups)) {
$newACLarray[]=trim($key);
}
}
}
} else if ($key == 'sms') {
if ($this->sms_changes_allowed) {
if (!$val && in_array($key,$this->groups)) {
$this->somethingChanged=1;
} else if ($val && !in_array($key,$this->groups)) {
$this->somethingChanged=1;
}
if ($val) $newACLarray[]=trim($key);
} else {
// copy old setting if exists
if (in_array($key,$this->groups)) {
$newACLarray[]=trim($key);
}
}
} else {
if ($val) $newACLarray[]=trim($key);
}
} else {
// copy old setting if exists
if (in_array($key,$this->groups)) {
$newACLarray[]=trim($key);
}
}
}
$foundGroupInAvailableGroups=array();
$extra_groups=explode(' ',$_REQUEST['extra_groups']);
foreach ($extra_groups as $_grp) {
if (!in_array($_grp,array_keys($this->availableGroups))) {
$newACLarray[]=$_grp;
}
}
$grantACLarray = array_unique(array_diff($newACLarray,$this->groups));
$revokeACLarray = array_unique(array_diff($this->groups,$newACLarray));
/*
dprint_r($this->groups);
dprint_r($newACLarray);
dprint_r($grantACLarray);
dprint_r($revokeACLarray);
*/
if (count($revokeACLarray) || count($grantACLarray)) {
$result->groups=$newACLarray;
$this->somethingChanged=1;
}
if ($language && $language != $this->Preferences['language'] ) {
if ($this->login_type == 'subscriber') {;
//print("Set lang $language");
$this->changeLanguage($language);
}
$this->setPreference("language",$language);
$this->somethingChanged=1;
}
if ($show_barring_tab != $this->Preferences['show_barring_tab'] ) {
$this->setPreference("show_barring_tab",$show_barring_tab);
$this->somethingChanged=1;
}
if ($this->Preferences['account_delete_request'] ) {
$this->setPreference("account_delete_request",date('m/d/Y h:i:s a', time()));
$this->somethingChanged=1;
}
if ($this->login_type == 'subscriber' && in_array("deny-password-change",$this->groups)) {
} else if ($sip_password) {
if ($this->store_clear_text_passwords) {
$result->password=$sip_password;
} else {
$md1=strtolower($this->username).':'.strtolower($this->domain).':'.$sip_password;
$md2=strtolower($this->username).'@'.strtolower($this->domain).':'.strtolower($this->domain).':'.$sip_password;
$result->password=md5($md1).':'.md5($md2);
}
$this->sendCEmail=1;
array_push($this->changedFields,"Password");
$this->somethingChanged=1;
}
if ($web_password) {
if ($this->store_clear_text_passwords) {
$web_password_new=$web_password;
} else {
$md1=strtolower($this->username).':'.strtolower($this->domain).':'.$web_password;
$md2=strtolower($this->username).'@'.strtolower($this->domain).':'.strtolower($this->domain).':'.$web_password;
$web_password_new=md5($md1).':'.md5($md2);
}
$this->setPreference('web_password',$web_password_new);
$this->sendCEmail=1;
array_push($this->changedFields,"Web password");
$this->somethingChanged=1;
}
if ($web_password_reset) {
$this->setPreference('web_password','remove');
$this->somethingChanged=1;
}
if ($this->Preferences['yubikey'] != $yubikey && !$this->isEmbedded()) {
$this->setPreference('yubikey',$yubikey);
$this->somethingChanged=1;
}
if (is_array($result->acl) and count($result->acl)) {
foreach (array_keys($result->acl) as $key) {
if (isset($result->acl[$key]->tag) && $result->acl[$key]->tag == '') {
unset($result->acl[$key]->tag);
}
}
}
if ($this->IPAccessListChangePolicy()) {
if (isset($ip_access_list) and $this->ip_access_list != $ip_access_list) {
$ip_access_list=preg_replace("/\s+/","\n", trim($ip_access_list));
$list=explode("\n", trim($ip_access_list));
$ip_access_list=array();
foreach ($list as $el) {
list($ip,$mask) = explode("/",$el);
if ($mask <0 or $mask > 32) {
continue;
}
if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) {
continue;
}
$ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask));
}
$result->acl=$ip_access_list;
$this->somethingChanged=1;
}
}
if (!$result->password) unset($result->password);
if ($timezone && $timezone != $this->timezone) {
$result->timezone=$timezone;
$this->somethingChanged=1;
}
if ($region != $this->region) {
$result->region=$region;
$this->somethingChanged=1;
}
if (strcmp($quickdial,$this->quickdial) != 0) {
$result->quickdialPrefix=$quickdial;
$this->somethingChanged=1;
}
$mobile_number = preg_replace("/[^\+0-9]/","",$mobile_number);
if ($mobile_number && !preg_match("/^\+/",$mobile_number)) {
$mobile_number='+'.$mobile_number;
}
if ($this->Preferences['mobile_number'] != $mobile_number) {
$this->setPreference('mobile_number',$mobile_number);
$this->somethingChanged=1;
}
if (!$this->createdVoicemailnow) {
// moved to its own tab
//$this->setDiversions();
}
if ($this->timeoutWasNotSet || $timeout != $this->timeout) {
$this->somethingChanged=1;
$result->timeout=intval($timeout);
}
if ($result->owner == '') {
$this->somethingChanged=1;
$result->owner=0;
}
if ($result->callLimit == '') {
$this->somethingChanged=1;
$result->callLimit=0;
}
if ($result->quota == '') {
$this->somethingChanged=1;
$result->quota=0;
}
if ($result->timeout == '') {
$this->somethingChanged=1;
$result->timeout=35;
}
if ($result->timeout > 900) {
$this->somethingChanged=1;
$result->timeout=900;
}
if ($this->somethingChanged) {
$result->properties=$this->properties;
if (!$result->quota) $result->quota=0;
//dprint_r($result);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->updateAccount($result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
dprint("Call updateAccount");
if ($this->sendCEmail && $this->notify_on_sip_account_changes) {
$this->sendChangedEmail(False,$this->changedFields);
}
}
}
if ($this->voicemail['Account'] && !$this->createdVoicemailnow) {
$delete_voicemail = $_REQUEST['delete_voicemail'];
//$log=sprintf("delete_voicemail_orig=%s",$this->voicemail['Options']->delete);
//dprint($log);
if (($delete_voicemail && !$this->voicemail['Options']->delete) ||
(!$delete_voicemail && $this->voicemail['Options']->delete)) {
$this->voicemail['Options']=array("delete"=>intval($delete_voicemail));
$this->voicemailOptionsHaveChanged=1;
}
$voicemail_password=preg_replace("/[^0-9]/","",$voicemail_password);
if ($this->voicemail['Password'] != $voicemail_password) {
$this->voicemailOptionsHaveChanged=1;
$this->voicemail['Password']=$voicemail_password;
}
if ($this->voicemailOptionsHaveChanged) {
$this->updateVoicemail();
}
}
$this->updateBillingProfiles();
}
function setDiversions() {
dprint ("setDiversions()");
$this->getVoicemail();
$this->getEnumMappings();
$this->getDivertTargets();
$this->getDiversions();
foreach (array_keys($this->diversionType) as $condition) {
$select_name = $condition."_select";
$selectedIdx = $_REQUEST[$select_name];
$textboxURI = $_REQUEST[$condition];
if ($textboxURI && $textboxURI != "" && !preg_match("/@/",$textboxURI)) {
$textboxURI=$textboxURI."@".$this->domain;
}
if (preg_match("/^([\+|0].*)@/",$textboxURI,$m)) {
$textboxURI=$m[1]."@".$this->domain;
}
$uri_description = $this->divertTargets[$selectedIdx]['description'];
if ($uri_description == 'Other' || $textboxURI == "") {
$selectedURI = $textboxURI;
} else {
$selectedURI = $this->divertTargets[$selectedIdx]['value'];
}
$uri = $selectedURI;
if (!$this->voicemail['Account'] && $uri_description == 'Voicemail') {
dprint("No voicemail account found");
$uri_description='Disabled';
}
if ($this->diversions[$condition]) {
if ($uri_description=='Disabled' && $this->CallPrefUriType[$condition]!='Disabled') {
$diversions[$condition]="";
} else if ($uri_description != 'Disabled' && $selectedURI) {
if (checkURI($selectedURI)) {
if ($this->CallPrefUriType[$condition]=='Disabled') {
$diversions[$condition]="";
} else {
if ($this->diversions[$condition] != $uri) {
$diversions[$condition]=$uri;
} else {
$diversions[$condition]=$this->diversions[$condition];
}
}
} else {
$diversions[$condition]=$this->diversions[$condition];
dprint("Failed to check address $selectedURI");
}
}
} else if ($uri_description!='Disabled' && $selectedURI) {
if (checkURI($selectedURI)) {
$diversions[$condition]=$uri;
} else {
dprint("Failed to check address $condition=\"$selectedURI\"");
$diversions[$condition]=$this->diversions[$condition];
}
}
if (!$uri_description) $uri_description="Other";
if ($uri_description == 'Other') {
$last_other=$uri;
} else {
$last_other = $this->CallPrefLastOther[$condition];
}
$_prefLast = $condition."_lastOther";
if ($uri_description=='Other' && $this->Preferences[$_prefLast] != $last_other ) {
$this->setPreference($_prefLast,$last_other);
}
}
foreach(array_keys($this->diversions) as $key) {
if ($this->diversions[$key] != $diversions[$key]) {
//$log=sprintf("Diversion %s changed from %s to %s",$key,htmlentities($this->diversions[$key]),htmlentities($diversions[$key]));
dprint($log);
$divert_changed=1;
}
if ($diversions[$key]) {
if ($diversions[$key] == "") {
if ($this->absolute_voicemail_uri) {
$diversionsSOAP[$key] = 'sip:'.$this->voicemail['Account'];
} else {
$diversionsSOAP[$key] = $diversions[$key];
}
} else {
$diversionsSOAP[$key]='sip:'.$diversions[$key];
}
} else {
if ($diversions[$key]) $diversionsSOAP[$key]=$diversions[$key];
}
}
if (!is_array($diversionsSOAP) || count($diversionsSOAP) == 0) {
$diversionsSOAP=array("nocondition"=>"empty");
}
if ($divert_changed) {
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setCallDiversions($this->sipId,$diversionsSOAP);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error2 (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
$this->diversions=$diversions;
}
}
}
function setDiversion($condition,$uri) {
dprint ("setDiversion($condition,$uri)");
$condition=trim($condition);
$uri=trim($uri);
$this->getVoicemail();
$this->getDivertTargets();
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getCallDiversions($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
$_uri_saved=$uri;
if ($_uri_saved == "voicemail") {
$uri="";
foreach ($this->divertTargets as $target) {
if ($target['description'] == 'Voicemail') {
$uri=$target['value'];
break;
}
}
}
if ($_uri_saved == "mobile") {
$uri="";
foreach ($this->divertTargets as $target) {
dprint_r($target);
if ($target['description'] == 'Mobile') {
$uri=$target['value'];
break;
}
}
}
if ($_uri_saved == "other" && $this->CallPrefLastOther[$condition]) {
$uri=$this->CallPrefLastOther[$condition];
}
if (strlen($uri)) {
if ($uri != "") {
if (!preg_match("/^(sip:|sips:)/",$uri)) $uri="sip:".$uri;
}
} else {
$uri=NULL;
}
reset($this->diversionType);
foreach(array_keys($this->diversionType) as $_condition) {
$uri=$result->$_condition;
if ($this->absolute_voicemail_uri && $uri == "") {
$uri = $this->voicemail['Account'];
}
if (preg_match("/^(sip:|sips:)(.*)$/i",$uri,$m)) {
$uri=$m[2];
}
//if (!$uri) $uri=NULL;
$this->diversions[$condition]=$uri;
}
dprint_r($this->diversions);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setCallDiversions($this->sipId,$result);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
function setVoicemailDiversions() {
dprint ("setVoicemailDiversions()");
if ($this->getVoicemail()) {
if (!$this->absolute_voicemail_uri) {
$diversions['FBUS']="";
$diversions['FNOA']="";
$diversions['FNOL']="";
} else {
$diversions['FBUS']="sip:".$this->voicemail['Account'];
$diversions['FNOA']="sip:".$this->voicemail['Account'];
$diversions['FNOL']="sip:".$this->voicemail['Account'];
}
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setCallDiversions($this->sipId,$diversions);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
}
function removeVoicemailDiversions() {
dprint ("removeVoicemailDiversions()");
$this->getDiversions();
$diversions=array();
foreach (array_keys($this->diversionType) as $key) {
if ($this->diversions[$key]=="" || preg_match("/voicemail_server/",$this->diversions[$key])) {
$diversions_have_changed=true;
} else {
if ($this->diversions[$key]) {
$diversions[$key]=$this->diversions[$key];
}
}
}
if (!count($diversions)) {
$diversions['nocondition']='empty';
}
if ($diversions_have_changed) {
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setCallDiversions($this->sipId,$diversions);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
} else {
return true;
}
}
function updateVoicemail() {
dprint("updateVoicemail()");
$account=array("sipId" => $this->sipId,
"email" => $this->email,
"name" => $this->firstName.' '.$this->lastName,
"password" => $this->voicemail['Password'],
"options" => $this->voicemail['Options']
);
dprint_r($account);
$this->VoicemailPort->addHeader($this->SoapAuthVoicemail);
$result = $this->VoicemailPort->updateAccount($account);
if ((new PEAR)->isError($result)) {
$error_msg=$result->getMessage();
$error_fault=$result->getFault();
$error_code=$result->getCode();
print "$error_msg\n";
printf (" Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
return true;
}
function addVoicemail() {
dprint("addVoicemail()");
$password=$this->RandomPassword();
$_account = array("sipId" => $this->sipId,
"name" => $this->fullName,
"password" => $password,
"email" => $this->email,
"options" => array("delete"=>1)
);
$this->VoicemailPort->addHeader($this->SoapAuthVoicemail);
$result = $this->VoicemailPort->addAccount($_account);
if ((new PEAR)->isError($result)) {
$error_msg=$result->getMessage();
$error_fault=$result->getFault();
$error_code=$result->getCode();
print "$error_msg\n";
printf (" Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
return true;
}
function deleteVoicemail() {
dprint("deleteVoicemail()");
$this->VoicemailPort->addHeader($this->SoapAuthVoicemail);
$result = $this->VoicemailPort->deleteAccount($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg=$result->getMessage();
$error_fault=$result->getFault();
$error_code=$result->getCode();
print "$error_msg\n";
printf (" Error (VoicemailPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
return true;
}
function setPreference($name,$value) {
dprint("setPreference($name,$value)");
if (!$name) return;
if (!is_array($this->properties)) {
$this->properties=array();
}
foreach (array_keys($this->properties) as $_key) {
$_prop=$this->properties[$_key];
if ($_prop->name == $name) {
if (strlen($value)) {
if ($value != 'remove') {
$newProperties[]=array('name'=> $name,
'value' => $value);
}
}
$found=1;
} else {
$newProperties[]=$_prop;
}
}
if (!$found) {
$newProperties[]=array('name' => $name,
'value' => $value);
}
if ($this->properties!=$newProperties) $this->somethingChanged=1;
if (!$newProperties) $newProperties = array();
$this->properties=$newProperties;
//dprint_r($this->properties);
}
function showCreditTab() {
if ($this->login_type == 'subscriber' && in_array("blocked",$this->groups)) {
return false;
}
$task = $_REQUEST['task'];
$issuer = $_REQUEST['issuer'];
$prepaidCard = $_REQUEST['prepaidCard'];
$prepaidId = $_REQUEST['prepaidId'];
$_done = false;
if ($issuer) {
print "
";
if ($issuer=='subscriber'){
if ($prepaidCard && $prepaidId) {
if ($result = $this->addBalanceSubscriber($prepaidCard,$prepaidId)) {
print " ";
printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance);
print "";
$_done=true;
}
}
} else if ($issuer=='reseller' || $issuer=='admin') {
if ($_REQUEST['task'] == 'change_balance') {
$description = $_REQUEST['description'];
$value = $_REQUEST['value'];
if (strlen($value) && $result = $this->addBalanceReseller($value,$description)) {
print " ";
printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance);
print "";
$_done=true;
}
} else if ($_REQUEST['task'] == 'refund') {
$transaction = json_decode(base64_decode($_REQUEST['transaction']));
printf ("Refunding transaction id %s in value of %s", $transaction->id, $transaction->value);
require('cc_processor.php');
$ccp = new CreditCardProcessor();
$refund_results = $ccp->refundPayment($transaction->id);
if(count($refund_results['error']) > 0 ){
printf (" Error %d: %s (%s)",$refund_results['error']['error_code'], $refund_results['error']['desc'], $refund_results['error']['short_message']);
} else {
printf (" Transaction %s refunded with %s: %s",$transaction->id, $refund_results['success']['desc']->RefundTransactionID,$refund_results['success']['desc']->GrossRefundAmount->_value);
$description=sprintf("Refund %s with %s",$transaction->id, $refund_results['success']['desc']->RefundTransactionID);
if ($result = $this->addBalanceReseller(-$transaction->value,$description)) {
print " ";
printf (_("Old balance was %s, new balance is %s. "),$result->old_balance, $result->new_balance);
print "";
$_done=true;
}
}
}
}
if ($_done && $_REQUEST['notify']) {
$subject=sprintf ("SIP Account %s balance update",$this->account);
$body="Your SIP Account balance has been updated. ".
"For more details go to $this->sip_settings_page?tab=credit";
if (mail($this->email, $subject, $body, "From: $this->support_email")) {
printf (_("Subscriber has been notified at %s."), $this->email);
}
}
print "
|
";
}
$this->getPrepaidStatus();
if ($this->prepaidAccount) {
$chapter=sprintf(_("Current Balance"));
$this->showChapter($chapter);
print "
";
print _("Your current balance is");
print ": ";
printf ("%.2f %s ",$this->prepaidAccount->balance,$this->currency);
print "
";
$this->showChangeBalanceReseller();
$this->showChangeBalanceSubscriber();
$this->showBalanceHistory();
}
}
function showChangeBalanceReseller () {
if (!$this->prepaid_changes_allowed) return false;
$chapter=sprintf(_("Add Balance"));
$this->showChapter($chapter);
print "
url method=post>
";
$transactions = $this->getPaymentIds();
if (count($transactions)) {
$chapter=sprintf(_("Refund Transaction"));
$this->showChapter($chapter);
print "
url method=post>
";
print _("Transaction Id");
print "
";
print "
Notify
";
}
}
function showChangeBalanceSubscriber () {
$this->showPrepaidVoucherForm();
}
function showPrepaidVoucherForm () {
if ($this->isEmbedded()) return true;
$chapter=sprintf(_("Prepaid Card"));
$this->showChapter($chapter);
print "
";
printf (_("To add Credit to your account using a Prepaid Card enter it below. "));
print "
";
print "
url method=post>
";
}
function getPrepaidStatus() {
dprint("getPrepaidStatus()");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getPrepaidStatus(array($this->sipId));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
unset($this->prepaidAccount);
return false;
} else {
$this->prepaidAccount=$result[0];
return true;
}
}
function addBalanceSubscriber($prepaidCard,$prepaidId) {
dprint("addBalanceSubscriberLocal($prepaidCard,$prepaidId)");
$card = array('id' => intval($prepaidId),
'number' => $prepaidCard
);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->addBalanceFromVoucher($this->sipId,$card);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
return $result;
}
}
function addBalanceReseller($value=0,$description='') {
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->addBalance($this->sipId,floatval($value),$description);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
} else {
return $result;
}
}
function getBalanceHistory() {
dprint("getBalanceHistory()");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getCreditHistory($this->sipId,200);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "2000") {
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
}
}
$this->balance_history=$result->entries;
}
function getPaymentIds() {
$transactions = array();
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getCreditHistory($this->sipId,200);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "2000") {
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
}
}
$refunded_transactions=array();
$credit_transactions=array();
foreach ($result->entries as $entry) {
if (preg_match("/^CC transaction (.*)$/",$entry->description,$m)) {
$credit_transactions[$m[1]]=$entry->value;
}
if (preg_match("/^Refund (.*) with (.*)$/",$entry->description,$m)) {
$refunded_transactions[]=$m[1];
}
}
foreach (array_keys($credit_transactions) as $tran) {
if (!in_array($tran, $refunded_transactions)) {
$transactions[$tran] = $credit_transactions[$tran];
}
}
return $transactions;
}
function getTodayBalanceSummary() {
$total_debit = 0;
$total_credit = 0;
foreach ($this->balance_history as $_line) {
$value=$_line->value;
if (substr($_line->date,0,10) != date("Y-m-d")) {
break;
}
if ($value <0) {
$total_debit+=$value;
}
if ($value >0) {
$total_credit+=$value;
}
}
$total = array('debit' => $total_debit,
'credit' => $total_credit
);
return $total;
}
function showBalanceHistory() {
$this->getBalanceHistory();
if (!count($this->balance_history)) {
return;
}
$chapter=sprintf(_("Balance History"));
$this->showChapter($chapter);
print "
";
$today_summary = $this->getTodayBalanceSummary();
if ($today_summary['credit'] >= $max_credit_per_day) {
print " ";
printf (_("Today's transactions: %.2f credit, %.2f debit"), $today_summary['credit'],$today_summary['debit']);
}
print "
";
print "";
print "";
print "";
print "";
print "";
print "";
print "";
print "";
print " ";
print "";
foreach ($this->balance_history as $_line) {
if (strstr($_line->description,'Session')) {
if (!$_line->value) continue;
$value=$_line->value;
if ($this->cdrtool_address && !$this->isEmbedded()) {
$description=sprintf("$_line->description",$this->cdrtool_address,urlencode($_line->session));
} else {
$description=$_line->description;
}
} else {
$description=$_line->description;
$value=$_line->value;
}
if ($value <0) {
$total_debit+=$value;
}
if ($value >0) {
$total_credit+=$value;
}
$found++;
$rr=floor($found/2);
$mod=$found-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
print "
";
printf ("
%d |
%s |
%s |
%s |
%s |
%s |
",$found,
$_line->date,
$_line->action,
$description,
number_format($value,4),
number_format($_line->balance,4)
);
}
print "
";
if (strlen($total_credit)) {
printf ("
|
|
|
%s |
%s |
|
",
_("Total Credit"),
number_format($total_credit,4)
);
}
if (strlen($total_debit)) {
printf ("
|
|
|
%s |
%s |
|
",
_("Total Debit"),
number_format($total_debit,4)
);
}
print "
";
if ($found) {
if (!$this->isEmbedded()) {
print " url&tab=credit&action=get_balance_history&csv=1 target=_new data-original-title='";
print _("Export");
print "' data-content='";
print _("Export balance history in CSV format");
print "' rel='popover' onclick=\"window.open('$this->url&tab=credit&action=get_balance_history&csv=1]')\">";
print _("Export");
print " ";
} else {
print " url&tab=credit&action=get_balance_history&csv=1 data-original-title='";
print _("Export");
print "' data-content='";
print _("Export balance history in CSV format");
print "' onclick=\"location.href='$this->url&tab=credit&action=get_balance_history&csv=1';\">";
print _("Export");
print " ";
}
}
print "";
}
function exportBalanceHistory() {
Header("Content-type: text/csv");
$h=sprintf("Content-Disposition: inline; filename=%s-prepaid-history.csv",$this->account);
Header($h);
print _("Id");
print ",";
print _("Account");
print ",";
print _("Date");
print ",";
print _("Action");
print ",";
print _("Description");
print ",";
print _("Value");
print ",";
print _("Final Balance");
print ("\n");
foreach ($this->balance_history as $_line) {
if (strstr($_line->description,'Session') && !$_line->value) continue;
$found++;
printf ("%s,%s,%s,%s,%s,%s,%s\n",
$found,
$this->account,
$_line->date,
$_line->action,
$_line->description,
$_line->value,
$_line->balance);
}
}
function showDiversions($conditions=array()) {
// for busy not online or unconditional
foreach (array_keys($this->diversionType) as $condition) {
$_prefName = $condition."_lastOther";
$this->CallPrefLastOther[$condition]= $this->Preferences[$_prefName];
}
if (!count($conditions)) {
$conditions=$this->diversionType;
}
foreach (array_keys($conditions) as $condition) {
$found++;
$rr=floor($found/2);
$mod=$found-$rr*2;
$pref_name = $conditions[$condition];
$pref_value = $this->diversions[$condition];
$select_name=$condition."_select";
$set_uri_java="set_uri_" . $condition;
$update_text_java="update_text_" . $condition;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
print "
";
$phoneValues = array();
foreach ($this->divertTargets as $phones) {
$phoneValues[] = $phones['value'];
}
$lastOther = $this->CallPrefLastOther[$condition];
$otherIdx = count($this->divertTargets) - 1;
$phoneValues[$otherIdx] = $lastOther;
$targets = sprintf("'%s'", join("', '", $phoneValues));
print "
";
print " ";
if ($this->CallPrefUriType[$condition]=='Other')
$style = "visible";
else
$style = "hidden";
$pref_value=$this->diversions[$condition];
print "
";
if ($condition=="FUNV" && $this->FUNC_access_number) {
print " ";
printf (_("Dial %s2*X where X = Number of Minutes, 0 to Reset"), $this->access_numbers['FUNC']);
print " ";
}
print "
";
}
}
function showHeader() {
/*print "
";*/
print "
";
if ($this->logoFile) {
print " logoFile border=0>";
}
print "
";
/*
print "
|
";
*/
}
function chapterTableStart() {
}
function chapterTableStop() {
}
function getEnumMappings () {
dprint("getEnumMappings()");
$this->enums=array();
$filter=array(
'type' => 'sip',
'mapto' => $this->account,
'owner' => intval($this->owner)
);
// Range
$range=array('start' => 0,
'count' => 10
);
// Order
$orderBy = array('attribute' => 'changeDate',
'direction' => 'ASC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->EnumPort->addHeader($this->SoapAuthEnum);
$result = $this->EnumPort->getNumbers($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (EnumPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
foreach($result->numbers as $_number) {
$enum='+'.$_number->id->number;
$this->voicemailUsernameOptions[]=$enum;
if (!in_array($enum,$this->enums)) $this->enums[]=$enum;
}
}
function enum2tel($enum_text) {
// transform enum style domain name in forward telephone number
$enum_text=trim($enum_text);
if (preg_match("/^\+\d+$/",$enum_text)) {
return $enum_text;
}
$z=0;
$tel_text="";
while ($z < strlen($enum_text)) {
$char = substr($enum_text,$z,1);
if (preg_match("/[a-zA-Z]/",$char)) {
break;
} else if (preg_match("/[0-9]/",$char)) {
$tel_text=$char.$tel_text;
$z++;
} else {
$z++;
}
}
if ($tel_text) {
$tel_text="+".$tel_text;
return ($tel_text);
} else {
return $enum_text;
}
}
function showTimezones($name,$value) {
if (!$fp = fopen("timezones", "r")) {
print _("Failed to open timezone file.");
return false;
}
printf ("";
}
function showQuickDial() {
if (!preg_match("/^\d+$/",$this->username)) return 1;
print "
";
}
function showMobileNumber() {
if (in_array("free-pstn",$this->groups)) {
print "
",$this->Preferences['mobile_number'],_("International format starting with +"));
}
}
function CallLimitChangePolicy() {
if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'reseller') {
return false;
}
if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'customer') {
return false;
}
if ($this->login_type == 'subscriber' and $this->call_limit_may_by_changed_by == 'admin') {
return false;
}
if ($this->login_type == 'customer' and $this->call_limit_may_by_changed_by == 'reseller') {
return false;
}
if ($this->login_type == 'customer' and $this->call_limit_may_by_changed_by == 'admin') {
return false;
}
if ($this->login_type == 'reseller' and $this->call_limit_may_by_changed_by == 'admin') {
return false;
}
return true;
}
function IPAccessListChangePolicy() {
if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'reseller') {
return false;
}
if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'customer') {
return false;
}
if ($this->login_type == 'subscriber' and $this->ip_access_list_may_by_changed_by == 'admin') {
return false;
}
if ($this->login_type == 'customer' and $this->ip_access_list_may_by_changed_by == 'reseller') {
return false;
}
if ($this->login_type == 'customer' and $this->ip_access_list_may_by_changed_by == 'admin') {
return false;
}
if ($this->login_type == 'reseller' and $this->ip_access_list_may_by_changed_by == 'admin') {
return false;
}
return true;
}
function showIPAccessList() {
if (!$this->soapEngines[$this->sip_engine]['ip_access_list']) {
return;
}
if (!$this->IPAccessListChangePolicy()) {
print "
%s
",$this->ip_access_list);
} else {
print "
",$this->ip_access_list);
}
}
function showCallLimit() {
if (!$this->pstn_access) {
return;
}
if (!in_array("free-pstn",$this->groups)) {
return;
}
if (!$this->soapEngines[$this->sip_engine]['call_limit']) {
return;
}
$limit_text = sprintf(_("Default is %s"), $this->platform_call_limit);
if (strlen($this->callLimit)) {
$limit_text_ro=$this->callLimit;
} else {
$limit_text_ro=$this->platform_call_limit;
}
if (!$this->CallLimitChangePolicy()) {
print "
%s
",$limit_text_ro);
} else {
print "
",$this->callLimit, $limit_text);
}
}
function showCallsTab() {
$this->getHistory();
if ($this->calls) {
$chapter=sprintf(_("Call Statistics"));
$this->showChapter($chapter);
$calltime=normalizeTime($this->duration);
print "
";
if ($this->cdrtool_address) {
print "cdrtool_address target=cdrtool>";
print _("Summary");
print "";
} else {
print _("Usage Data");
}
print "
|
";
printf (_("%s calls / %s / %s / %.2f %s"), $this->calls, $calltime,$this->trafficPrint,$this->price,$this->currency);
print "
|
";
print "
";
print _("First / Last Call");
print "
|
$this->firstCall / $this->lastCall
|
";
}
if ($this->enable_thor) {
$cdr_source = 'sipthor';
} else {
$cdr_source = 'sip_trace';
}
if (count($this->calls_received)) {
$chapter=sprintf(_("Incoming"));
$this->showChapter($chapter);
$j=0;
print " ";
foreach (array_keys($this->calls_received) as $call) {
$j++;
$uri = $this->calls_received[$call]['remoteParty'];
$media="";
foreach ($this->calls_received[$call]['media'] as $m) {
$media.="$m,";
}
$media=quoted_printable_decode($media);
$media=rtrim($media,",");
$duration = normalizeTime($this->calls_received[$call]['duration']);
$dialURI = $this->PhoneDialURL($uri) ;
$htmlDate = $this->colorizeDate($this->calls_received[$call]['startTime']);
$htmlURI = $this->htmlURI($uri);
$urlURI = urlencode($this->normalizeURI($uri));
$sessionId = urlencode($this->calls_received[$call]['sessionId']);
$fromTag = urlencode($this->calls_received[$call]['fromTag']);
$toTag = urlencode($this->calls_received[$call]['toTag']);
$proxyIP = urlencode($this->calls_received[$call]['proxyIP']);
$trace_link = "Server Logs";
if (!$this->calls_received[$call]['duration']) {
$htmlURI = "$htmlURI";
}
$rr=floor($j/2);
$mod=$j-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
print "
$htmlDate |
$dialURI |
$duration |
$htmlURI ($media) |
";
print "$trace_link | ";
print "url&tab=contacts&task=add&uri=$urlURI&search_text=$urlURI>$this->phonebook_img | ";
print "
";
}
print " ";
}
if (count($this->calls_placed)) {
$chapter=sprintf(_("Outgoing"));
$this->showChapter($chapter);
$j=0;
print " ";
foreach (array_keys($this->calls_placed) as $call) {
$j++;
if ($this->calls_placed[$call]['to'] == "sip:".$this->voicemail['Account'] ) {
continue;
}
$uri = $this->calls_placed[$call]['remoteParty'];
$media = "";
foreach ($this->calls_placed[$call]['media'] as $m) {
$media.="$m,";
}
$media=rtrim($media,",");
$price = $this->calls_placed[$call]['price'];
$status = $this->calls_placed[$call]['status'];
$rateinfo = $this->calls_placed[$call]['rateInfo'];
$duration = normalizeTime($this->calls_placed[$call]['duration']);
$dialURI = $this->PhoneDialURL($uri) ;
$htmlDate = $this->colorizeDate($this->calls_placed[$call]['startTime']);
$stopTime = $this->calls_placed[$call]['stopTime'];
$htmlURI = $this->htmlURI($uri);
$urlURI = urlencode($this->normalizeURI($uri));
$sessionId = urlencode($this->calls_placed[$call]['sessionId']);
$fromTag = urlencode($this->calls_placed[$call]['fromTag']);
$toTag = urlencode($this->calls_placed[$call]['toTag']);
$proxyIP = urlencode($this->calls_placed[$call]['proxyIP']);
$trace_link = "Server Logs";
if ($price) {
$price_print =sprintf(" (%s %s)",$price,$this->currency);
} else {
$price_print = '';
}
$rr=floor($j/2);
$mod=$j-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
if (!$stopTime) {
$duration = _('In progress');
}
print "
$htmlDate |
$dialURI |
$duration |
$htmlURI ($media) $price_print |
";
print "$trace_link | ";
print "url&tab=contacts&task=add&uri=$urlURI&search_text=$urlURI>$this->phonebook_img | ";
print "
";
}
print " ";
}
}
function getHistory($status = 'all')
{
dprint("getHistory()");
$fromDate = time() - 3600 * 24 * 14; // last two weeks
$toDate = time();
$CallQuery = array(
"fromDate" => $fromDate,
"toDate" => $toDate,
"limit" => 50
);
$CallsQuery = array(
"placed" => $CallQuery,
"received" => $CallQuery
);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getCalls($this->sipId, $CallsQuery);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
// received calls
foreach ($result->received as $callStructure) {
$media = array();
$apps = explode(",", quoted_printable_decode($callStructure->applicationTypes[0]));
foreach ($apps as $app) {
$media[] = trim($app);
}
if (!$callStructure->stopTime && $status == 'completed') {
continue;
}
$fromHeader = quoted_printable_decode($callStructure->fromHeader);
$this->calls_received[] = array(
"remoteParty" => quoted_printable_decode($callStructure->fromURI),
"displayName" => getDisplayNameFromFromHeader($fromHeader),
"startTime" => getLocalTime($this->timezone, $callStructure->startTime),
"stopTime" => getLocalTime($this->timezone, $callStructure->stopTime),
"timezone" => $this->timezone,
"duration" => $callStructure->duration,
"status" => $callStructure->status,
"sessionId" => quoted_printable_decode($callStructure->sessionId),
"fromTag" => quoted_printable_decode($callStructure->fromTag),
"toTag" => quoted_printable_decode($callStructure->toTag),
"proxyIP" => $callStructure->proxyIP,
"media" => $media
);
}
// placed calls
foreach ($result->placed as $callStructure) {
if ($callStructure->status == 435) continue;
$media = array();
$apps = explode(",", quoted_printable_decode($callStructure->applicationTypes[0]));
foreach ($apps as $app) {
$media[] = trim($app);
}
if (!$callStructure->stopTime && $status == 'completed') {
continue;
}
$fromHeader = quoted_printable_decode($callStructure->fromHeader);
$this->calls_placed[] = array(
"remoteParty" => quoted_printable_decode($callStructure->toURI),
"displayName" => getDisplayNameFromFromHeader($fromHeader),
"startTime" => getLocalTime($this->timezone, $callStructure->startTime),
"stopTime" => getLocalTime($this->timezone, $callStructure->stopTime),
"timezone" => $this->timezone,
"duration" => $callStructure->duration,
"status" => $callStructure->status,
"price" => $callStructure->price,
"sessionId" => quoted_printable_decode($callStructure->sessionId),
"fromTag" => quoted_printable_decode($callStructure->fromTag),
"toTag" => quoted_printable_decode($callStructure->toTag),
"proxyIP" => $callStructure->proxyIP,
"media" => $media
);
}
$this->call_history = array(
'placed' => $this->calls_placed,
'received' => $this->calls_received
);
}
function getCallStatistics()
{
dprint("getCallStatistics()");
$fromDate = mktime(0, 0, 0, date("m"), "01", date("Y"));
$toDate = time();
$CallQuery = array(
"fromDate" => $fromDate,
"toDate" => $toDate
);
$CallQuery = array(
"limit" => 1
);
$CallsQuery = array(
"placed" => $CallQuery
);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getCallStatistics($this->sipId, $CallsQuery);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
//dprint_r($result);
$this->thisMonth['calls'] = $result->placed->calls;
$this->thisMonth['price'] = $result->placed->price;
}
function addPhonebookEntry()
{
dprint("addPhonebookEntry()");
$uri = strtolower(trim($_REQUEST['uri']));
$name = trim($_REQUEST['name']);
$group = trim($_REQUEST['group']);
if (!strlen($uri)) return false;
$phonebookEntry = array(
'uri' => $uri,
'name' => $name,
'group' => $group
);
dprint("addPhonebookEntry");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->addPhoneBookEntry($this->sipId, $phonebookEntry);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
"
Error (SipPort): %s (%s): %s
",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
return true;
}
function updatePhonebookEntry()
{
dprint("updatePhonebookEntry()");
$uri = strtolower(trim($_REQUEST['uri']));
$group = trim($_REQUEST['group']);
$name = trim($_REQUEST['name']);
$phonebookEntry = array(
'name' => $name,
'uri' => $uri,
'group' => $group
);
//dprint_r($phonebookEntry);
dprint("updatePhonebookEntry");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->updatePhoneBookEntry($this->sipId, $phonebookEntry);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
return true;
}
function deletePhonebookEntry()
{
dprint("deletePhonebookEntry()");
$uri = strtolower($_REQUEST['uri']);
dprint("deletePhonebookEntry");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->deletePhoneBookEntry($this->sipId, $uri);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
return true;
}
function getPhoneBookEntries()
{
dprint("getPhoneBookEntries()");
if ($_REQUEST['task'] == 'search') {
$search_text = trim($_REQUEST['uri']);
}
$group = trim($_REQUEST['group']);
if (!strlen($search_text)) $search_text="%" ;
$match = array(
'uri' => '%'.$search_text.'%',
'name' => '%'.$search_text.'%'
);
if (strlen($group)) {
if ($group == "empty") {
$match['group'] = '';
} else {
$match['group'] = $group;
}
}
$range = array(
'start' => 0,
'count' => 100
);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getPhoneBookEntries($this->sipId, $match, $range);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
$this->PhonebookEntries=$result->entries;
//dprint_r($this->PhonebookEntries);
}
function showContactsTab()
{
dprint("showContactsTab()");
if ($this->show_directory) {
$chapter = sprintf(_("Directory"));
$this->showChapter($chapter);
print " ";
print _("To find other SIP Addresses fill in the First Name or the Last Name and click the Search button. ");
print " ";
$this->showSearchDirectory();
print " ";
}
if ($this->rows || $_REQUEST['task'] == 'directory') {
// hide local contacts if we found a global contact
return true;
}
$chapter = sprintf(_("Don't Disturb")).' '.sprintf(_("Groups"));
$this->showChapter($chapter);
print " ";
print _("You can organize contacts into groups that can be used to accept incoming calls in Don't Disturb section. ");
print " ";
$adminonly = $_REQUEST['adminonly'];
$accept = $_REQUEST['accept']; // selected search group;
$task = $_REQUEST['task'];
//if ($task == "search" ){
$search_text = $_REQUEST['uri'];
// }
$confirm = $_REQUEST['confirm'];
$group = $_REQUEST['group'];
$uri = $_REQUEST['uri'];
$name = $_REQUEST['name'];
if ($task == "deleteContact" && $confirm) {
$this->deletePhonebookEntry();
unset($task);
unset($confirm);
} elseif ($task == "update") {
$this->updatePhonebookEntry();
unset($task);
} elseif ($task == "add") {
$this->addPhonebookEntry();
unset($task);
}
$this->getPhoneBookEntries();
$maxrowsperpage = 250;
$url_string = $this->url."&tab=contacts";
printf(
"
",
$this->url,
$this->url,
$this->url,
_("Add sip address or search for contacts")
);
if (count($this->PhonebookEntries) || $task == "search"){
$selected[$group] = "selected";
printf(
"
",
$selected['empty'],
_("No group"),
_("Search")
);
}
printf(
"
%s
",
_("Add"),
_("(wildcard %)")
);
if (count($this->PhonebookEntries)){
print "
";
print "";
print "";
print "";
print " ";
foreach (array_keys($this->PhonebookEntries) as $_entry) {
$found = $i + 1;
$rr = floor($found / 2);
$mod = $found - $rr * 2;
if ($mod == 0) {
$_class = 'odd';
} else {
$_class = 'even';
}
printf(
"
%s
%s | %s |
",
$_class,
$found,
$this->url,
$this->tab,
$this->hiddenElements,
$this->tab,
$this->PhonebookEntries[$_entry]->uri,
$found,
$this->PhonebookEntries[$_entry]->uri
);
if (preg_match("/\%/", $this->PhonebookEntries[$_entry]->uri)) {
print " | ";
} else {
printf(
"
| %s |
",
$this->PhoneDialURL($this->PhonebookEntries[$_entry]->uri)
);
}
printf("", _("Update"));
print " | ";
printf(
"";
print " | ";
if ($task == "deleteContact" && $uri == $this->PhonebookEntries[$_entry]->uri) {
print "";
printf(
"",
$url_string,
urlencode($this->PhonebookEntries[$_entry]->uri),
urlencode($search_text)
);
print _("Confirm");
} else {
print " | ";
printf(
"",
$url_string,
urlencode($this->PhonebookEntries[$_entry]->uri),
urlencode($search_text)
);
if ($this->delete_img) {
//print $this->delete_img;
print "";
} else {
print _("Delete");
}
}
print "";
print " | ";
$i++;
}
print " ";
print " ";
}
}
function exportPhonebook($userAgent)
{
dprint("exportPhonebook()");
$this->getPhonebookEntries();
$this->contentType = "Content-type: text/csv";
if (!is_array($this->PhonebookEntries) || !count($this->PhonebookEntries)) return true;
if (!$userAgent) $userAgent = 'snom';
if ($userAgent == 'snom') {
$this->export_filename = "tbook.csv";
$phonebook .= sprintf("Name,Address,Group\n");
} elseif ($userAgent == 'eyebeam') {
$phonebook .= sprintf("Name,Group Name,SIP URL,Proxy ID\n");
} elseif ($userAgent == 'csco') {
$this->contentType = "Content-type: text/xml";
$this->export_filename = "directory.xml";
$phonebook .= sprintf(
" \n\t%s\n\tDirectory\n",
$this->account
);
} elseif ($userAgent == 'unidata') {
$this->export_filename = "phonebook.csv";
$phonebook .= sprintf("Index,Name,,,,\n");
$phonebook .= sprintf("0,Undefined,,,,\n");
$z = 1;
foreach ($this->PhonebookGroups as $_group) {
$this->groupIndex[$_group] = $z;
$phonebook .= sprintf("%s,%s,,,,\n", $z, $_group);
$z++;
}
$phonebook .= sprintf("\nIndex,Name,RdNm,Tel,Group\n");
}
$found = 0;
foreach (array_keys($this->PhonebookEntries) as $_entry) {
$fname = $this->PhonebookEntries[$_entry]->firstName;
$lname = $this->PhonebookEntries[$_entry]->lastName;
$uri = $this->PhonebookEntries[$_entry]->uri;
$group = $this->PhonebookEntries[$_entry]->group;
if (!preg_match("/[_%]/", $uri)) {
$uri = substr($uri, 4);
$els = explode("@", $uri);
if ($els[1] == $this->domain) $uri=$els[0];
if ($userAgent == 'snom') {
$phonebook .= sprintf(
"%s %s,%s,%s\n",
$fname,
$lname,
$uri,
$this->PhonebookGroups[$group]
);
} elseif ($userAgent == 'unidata' && $fname && $lname) {
$phonebook .= sprintf(
"%s,%s,%s %s,%s,%s\n",
$found,
$fname,
$fname,
$lname,
$uri,
$this->PhonebookGroups[$group]
);
} elseif ($userAgent == 'eyebeam') {
$phonebook .= sprintf(
"%s %s,%s,1\n",
$fname,
$lname,
$this->PhonebookEntries[$_entry]->uri,
$this->PhonebookGroups[$group]
);
} elseif ($userAgent == 'csco') {
$phonebook .= sprintf(
"\n\t\n\t%s %s\n\t%s\n\t\n",
$fname,
$lname,
$uri
);
}
$found++ ;
}
}
if ($userAgent == 'csco') {
$phonebook .= sprintf("\n\n");
}
Header($this->contentType);
$_header = sprintf("Content-Disposition: inline; filename=%s", $this->export_filename);
Header($_header);
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Pragma: no-cache");
print $phonebook;
}
function getRejectMembers()
{
dprint("getRejectMembers()");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getRejectMembers($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
$this->rejectMembers = $result;
//dprint_r($this->rejectMembers);
return true;
}
function setRejectMembers()
{
$members = array();
$rejectMembers = $_REQUEST['rejectMembers'];
foreach ($rejectMembers as $_member) {
if (strlen($_member) && !preg_match("/^sip:/", $_member)) {
$_member = 'sip:'.$_member;
}
if (strlen($_member)) $members[] = $_member;
}
dprint("setRejectMembers");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setRejectMembers($this->sipId, $members);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf(
" Error (SipPort): %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
return false;
}
}
function getJournalEntries() {
$this->journalEntries['success'] = false;
$this->journalEntries['error_message'] = NULL;
$this->journalEntries['results'] = array();
$return_summary = $_REQUEST['summary'];
if ($this->chat_replication_backend == 'mysql') {
$this->db = new DB_CDRTool();
$where="";
if ($_REQUEST['except_uuid']) {
$where.= sprintf(" and uuid <> '%s'", addslashes($_REQUEST['except_uuid']));
}
if ($_REQUEST['after_id']) {
$after_id = intval($_REQUEST['after_id']);
} else {
$after_id = 0;
}
$where.= sprintf(" and id > %d", addslashes($after_id));
if ($_REQUEST['after_timestamp']) {
$where.= sprintf(" and timestamp > '%s'", addslashes($_REQUEST['after_timestamp']));
}
if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) {
$limit = intval($limit);
} else {
$limit = 5000;
}
$query=sprintf("select * from client_journal where account = '%s' %s order by timestamp ASC limit %d", addslashes($this->account), $where, $limit);
if (!$this->db->query($query)) {
$this->journalEntries['error_message'] = 'Database Failure';
$this->journalEntries['rows'] = 0;
return false;
} else {
$this->journalEntries['success'] = true;
$this->journalEntries['rows'] = $this->db->num_rows();
}
if ($this->db->num_rows()) {
while ($this->db->next_record()) {
$entry = array(
'id' => $this->db->f('id'),
'source' => 'default',
'timestamp' => $this->db->f('timestamp'),
'account' => $this->db->f('account'),
'uuid' => $this->db->f('uuid'),
'ip_address' => $this->db->f('ip_address'),
'data' => $this->db->f('data')
);
$this->journalEntries['results'][]=$entry;
}
}
} else {
if (!$this->getMongoJournalTable()) {
$result['success'] = false;
$result['error_message'] = $this->mongo_exception;
return $result;
}
$mongo_where=array();
$mongo_where['account'] = $this->account;
if ($_REQUEST['except_uuid']) {
$mongo_where['uuid'] = array('$ne' => $_REQUEST['except_uuid']);
}
if ($_REQUEST['after_timestamp']) {
$mongo_where['timestamp'] = array('$gt' => intval($_REQUEST['after_timestamp']));
}
if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) {
$limit = intval($limit);
} else {
$limit = 5000;
}
$cursor = $this->mongo_table_ro->find($mongo_where)->sort(array('timestamp'=>1))->limit($limit)->slaveOkay();
$this->journalEntries['success'] = true;
$this->journalEntries['rows'] = $cursor->count();
foreach ($cursor as $result) {
$entry = array(
'id' => strval($result['_id']),
'source' => 'default',
'timestamp' => $result['timestamp'],
'account' => $result['account'],
'uuid' => $result['uuid'],
'ip_address' => $result['ip_address'],
'data' => $result['data']
);
$this->journalEntries['results'][]=$entry;
}
if ($return_summary) {
$mongo_where=array();
$mongo_where['account'] = $this->account;
if ($_REQUEST['except_uuid']) {
$mongo_where['uuid'] = array('$ne' => $_REQUEST['except_uuid']);
}
if ($_REQUEST['limit'] and intval($_REQUEST['limit']) < 5000) {
$limit = intval($limit);
} else {
$limit = 5000;
}
$cursor = $this->mongo_table_ro->find($mongo_where)->sort(array('timestamp'=>1))->limit($limit)->slaveOkay();
foreach ($cursor as $result) {
$entry = array(
'journal_id' => strval($result['_id']),
'timestamp' => $result['timestamp'],
);
$this->journalEntries['summary'][]=$entry;
}
}
}
return True;
}
function putJournalEntries() {
$result['results'] = array();
if (strlen($_REQUEST['uuid'])) {
$uuid = $_REQUEST['uuid'];
} else {
$result['success'] = false;
$result['error_message'] = 'Missing uuid';
return $result;
}
if (strlen($_REQUEST['data'])) {
$data = $_REQUEST['data'];
} else {
$result['success'] = false;
$result['error_message'] = 'Missing data';
return $result;
}
if ($this->chat_replication_backend == 'mysql') {
$this->db = new DB_CDRTool();
} else if ($this->chat_replication_backend == 'mongo') {
if (!$this->getMongoJournalTable()) {
$result['success'] = false;
$result['error_message'] = $this->mongo_exception;
return $result;
}
}
if ($rows=json_decode($data)) {
foreach ($rows as $row) {
if (!property_exists($row, 'data')) {
continue;
}
$entry = $row->data;
if (property_exists($row, 'action')) {
$action = $row->action;
} else {
$action = 'add';
}
if ($this->chat_replication_backend == 'mysql') {
$query=sprintf("insert into client_journal (timestamp, account, uuid, data, ip_address) values (NOW(),'%s', '%s', '%s', '%s')", addslashes($this->account), addslashes($uuid), addslashes($entry), addslashes($_SERVER['REMOTE_ADDR']));
if (!$this->db->query($query)) {
$result['results'][]=array('id' => $row->id,
'journal_id' => NULL,
'source' => 'default'
);
} else {
$query="select LAST_INSERT_ID() as id";
$this->db->query($query);
$this->db->next_record();
$id = $this->db->f('id');
$result['results'][]=array('id' => $row->id,
'journal_id' => $id,
'source' => 'default'
);
}
} else if ($this->chat_replication_backend == 'mongo') {
if ($action == 'add') {
$timestamp = time();
$mongo_query=array('timestamp' => $timestamp,
'datetime' => Date("Y-m-d H:i:s", $timestamp),
'account' => $this->account,
'uuid' => $uuid,
'data' => $entry,
'ip_address' => $_SERVER['REMOTE_ADDR']
);
$this->mongo_table_rw->insert($mongo_query);
if ($mongo_query['_id']) {
$mongo_id = strval($mongo_query['_id']);
$result['results'][]=array('id' => $row->id,
'journal_id' => $mongo_id,
'source' => 'default'
);
} else {
$result['results'][]=array('id' => $row->id,
'journal_id' => NULL,
'source' => 'default'
);
}
} else if ($action == 'remove') {
if (property_exists($row, 'journal_id')) {
$mongo_query=array(
'account' => $this->account,
'journal_id' => $row->journal_id
);
$this->mongo_table_rw->remove($mongo_query);
$result['results'][]=array('id' => NULL,
'journal_id' => $row->journal_id
);
}
}
}
}
$result['success'] = true;
} else {
$result['success'] = false;
$result['error_message'] = 'Json decode error';
}
return $result;
}
function deleteJournalEntries() {
if (strlen($_REQUEST['data'])) {
$data = $_REQUEST['data'];
$entries = json_decode($data);
} else {
if (strlen($_REQUEST['journal_id'])) {
$entries=array($_REQUEST['journal_id']);
} else {
$result['success'] = false;
$result['error_message'] = 'Missing data';
return $result;
}
}
if ($this->chat_replication_backend == 'mysql') {
$this->db = new DB_CDRTool();
} else if ($this->chat_replication_backend == 'mongo') {
if (!$this->getMongoJournalTable()) {
$result['success'] = false;
$result['error_message'] = $this->mongo_exception;
return $result;
}
}
if ($entries) {
if ($this->chat_replication_backend == 'mysql') {
$journal_id_sql="";
foreach ($entries as $entry) {
$journal_id_sql.=sprintf("'%s',",$entry);
}
$journal_id_sql = rtrim($journal_id_sql,",");
$query=sprintf("delete from client_journal where account in '%s' and journal_id in (%s)", addslashes($this->account), addslashes($journal_id_sql));
if (!$this->db->query($query)) {
$result['error_message'] = 'database error';
} else {
$result['success'] = true;
}
} else if ($this->chat_replication_backend == 'mongo') {
$id_entries=array();
foreach ($entries as $entry) {
$id_entries[] = new MongoId($entry);
}
$mongo_query=array('account' => $this->account,
'_id' => array('$in'=> $id_entries)
);
$this->mongo_table_rw->remove($mongo_query);
$result['success'] = true;
}
} else {
$result['success'] = false;
$result['error_message'] = 'No journal entries provided';
}
return $result;
}
function getAcceptRules() {
dprint("getAcceptRules()");
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->getAcceptRules($this->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
foreach(array_keys($result->rules->persistent) as $_rule) {
$_key=$result->rules->persistent[$_rule]->days;
$this->acceptRules['persistent'][$_key]=array('start' =>$result->rules->persistent[$_rule]->start,
'stop' =>$result->rules->persistent[$_rule]->stop,
'groups'=>$result->rules->persistent[$_rule]->groups);
}
$this->acceptRules['temporary']=array('groups' => $result->rules->temporary->groups,
'duration'=> $result->rules->temporary->duration
);
$this->acceptRules['groups'] = $result->nonEmptyGroups;
//dprint_r($this->acceptRules);
return true;
}
function setAcceptRules() {
dprint("setAcceptRules()");
$persistentAcceptArray=array();
$temporaryAcceptArray=array();
foreach (array_keys($this->acceptDailyProfiles) as $profile) {
unset($groups);
$radio_persistentVarName='radio_persistent_'.$profile;
$radio_persistent=$_REQUEST[$radio_persistentVarName];
if ($radio_persistent=="0") {
$groups[]='everybody';
} else if ($radio_persistent=="1") {
$groups[]='nobody';
} else if ($radio_persistent=="2") {
$groupsVarName='groups_'.$profile;
$groups=$_REQUEST[$groupsVarName];
}
$startVarName='start_'.$profile;
$start=$_REQUEST[$startVarName];
$stopVarName='stop_'.$profile;
$stop=$_REQUEST[$stopVarName];
if (!preg_match("/^[0-2][0-9]:[0-5][0-9]$/",$start) ||
!preg_match("/^[0-2][0-9]:[0-5][0-9]$/",$stop) ||
($start=="00:00" && $stop=="00:00") ||
!$start ||
!$stop ||
($radio_persistent=="2" && (!is_array($groups) || !count($groups) )) ) {
continue;
}
$persistentAcceptArray[]=array('start' => $start,
'stop' => $stop,
'groups' => $groups,
'days' => intval($profile)
);
}
// temporary
$radio_temporary=$_REQUEST['radio_temporary'];
unset($groups_temporary);
if ($radio_temporary=="0") {
$groups_temporary[]='everybody';
} else if ($radio_temporary=="1") {
$groups_temporary[]='nobody';
} else if ($radio_temporary=="2") {
$groups_temporary=$_REQUEST['groups_temporary'];
}
if (!is_array($groups_temporary)) $groups_temporary=array();
$duration=$_REQUEST['duration'];
$temporaryAccept=array("groups" => $groups_temporary,
"duration"=> intval($duration)
);
// combine persistent and temporary
$rules=array("persistent" =>$persistentAcceptArray,
"temporary" =>$temporaryAccept);
$this->SipPort->addHeader($this->SoapAuth);
$result = $this->SipPort->setAcceptRules($this->sipId,$rules);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf (" Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
return true;
}
function showAcceptTab() {
$chapter=sprintf(_("Do Not Disturb"));
$this->showChapter($chapter);
$this->getAcceptRules();
$this->getVoicemail();
$this->getDivertTargets();
$this->getDiversions();
print "
";
print "
";
print _("You can reject calls depending on the time of day and Caller-ID. ");
print _("You can create custom groups in the Contacts page like Family or Coworkers. ");
print "
";
print _("Rejected calls are diverted based on the Unavailable condition in the Call Forwarding page. ");
print " ";
print " ";
printf (_("Your current time is: %s"),$this->timezone);
$timestamp=time();
$LocalTime=getLocalTime($this->timezone,$timestamp);
print " $LocalTime";
print "
";
// $chapter=sprintf(_("Rules"));
// $this->showChapter($chapter);
/* print "
";
print _("This will override the permanent rules for the chosen duration. ");
print "
";
*/
if ($this->acceptRules['temporary']['duration']) {
$class_e='error';
} else {
$class_e='';
}
// print "
//
//";
// print "";
// print _("minute(s)");
// print "";
//print "
//
//";
$chapter=sprintf(_("Rules"));
$this->showChapter($chapter);
print "
";
print " ";
print "
";
print _("Temporary");
print " | ";
print "";
print _("Duration");
print " | ";
if ($this->acceptRules['temporary']['duration']) {
printf ('
',$this->acceptRules['temporary']['duration']);
print " acceptRules['temporary']['duration'];
print "\" disabled=true>";
print " acceptRules['temporary']['duration'];
print "\"> ";
} else {
print " ";
print _("Minute(s)");
print "";
}
print " | ";
$_name="radio_temporary";
$_checked_everybody="";
$_checked_nobody="";
$_checked_groups="";
if (is_array($this->acceptRules['temporary']['groups']) &&in_array("everybody",$this->acceptRules['temporary']['groups'])) {
$_checked_everybody="checked";
} else if (is_array($this->acceptRules['temporary']['groups']) && in_array("nobody",$this->acceptRules['temporary']['groups'])) {
$_checked_nobody="checked";
} else if (!in_array('everybody',$this->acceptRules['temporary']['groups']) &&
!in_array('nobody',$this->acceptRules['temporary']['groups']) &&
count($this->acceptRules['temporary']['groups'])) {
$_checked_groups="checked";
}
if ($_checked_nobody) {
$class_nobody="checked_groups";
} else {
$class_nobody="note";
}
printf (" %s | ",$_name,$_checked_everybody,_("Everybody"));
printf (" %s | ",$_name,$_checked_nobody,_("Nobody"));
$c=count($this->acceptRules['groups']);
if ($_checked_groups) {
$class_groups="checked_groups";
} else {
$class_groups="note";
}
print "";
if (count($this->acceptRules['groups'])>2) {
printf ("",$_name,$_checked_groups);
$i=0;
foreach(array_keys($this->acceptRules['groups']) as $_group) {
$i++;
if (preg_match("/(everybody|nobody)/",$this->acceptRules['groups'][$_group])) continue;
if (in_array($this->acceptRules['groups'][$_group],$this->acceptRules['temporary']['groups'])) {
$_checked="checked";
} else {
$_checked="";
}
$_name="groups_temporary[]";
printf (" %s\n",
$_name,
$this->acceptRules['groups'][$_group],
$_checked,
$this->PhonebookGroups[$this->acceptRules['groups'][$_group]]
);
}
}
print " | ";
print "
";
print _("Permanent");
print " |
";
print _("Days");
print " |
";
print _("Time Interval");
print " |
";
print _("Groups");
print " |
";
foreach (array_keys($this->acceptDailyProfiles) as $profile) {
if ($this->acceptRules['persistent'][$profile]['start'] || $this->acceptRules['persistent'][$profile]['stop']) {
$class="checked_groups";
$class2="label label-info";
} else {
$class="mhj";
$class2='';
}
if ($profile==1) {
print " | ";
}
print "
";
printf ("%s",$this->acceptDailyProfiles[$profile]);
print " | ";
unset($selected_StartTime);
$selected_StartTime[$this->acceptRules['persistent'][$profile]['start']]="selected";
printf ("";
unset($selected_StopTime);
$selected_StopTime[$this->acceptRules['persistent'][$profile]['stop']]="selected";
printf (" | ";
$_name="radio_persistent_".$profile;
$_checked_everybody="";
$_checked_nobody="";
$_checked_groups="";
if (is_array($this->acceptRules['persistent'][$profile]['groups']) && in_array("everybody",$this->acceptRules['persistent'][$profile]['groups'])) {
$_checked_everybody="checked";
} else if (is_array($this->acceptRules['persistent'][$profile]['groups']) && in_array("nobody",$this->acceptRules['persistent'][$profile]['groups'])) {
$_checked_nobody="checked";
} else if (!in_array('everybody',$this->acceptRules['persistent'][$profile]['groups']) &&
!in_array('nobody',$this->acceptRules['persistent'][$profile]['groups']) &&
count($this->acceptRules['persistent'][$profile]['groups'])) {
$_checked_groups="checked";
} else {
$_checked_everybody="checked";
}
if ($_checked_nobody) {
$class_nobody="checked_groups";
} else {
$class_nobody="note";
}
printf (" | %s | ",$_name,$_checked_everybody,_("Everybody"));
printf (" %s | ",$_name,$_checked_nobody,_("Nobody"));
$c=count($this->acceptRules['groups']);
if ($_checked_groups) {
$class_groups="checked_groups";
} else {
$class_groups="note";
}
print "";
if (count($this->acceptRules['groups'])>2) {
printf ("",$_name,$_checked_groups);
$i=0;
foreach(array_keys($this->acceptRules['groups']) as $_group) {
$i++;
if (preg_match("/(everybody|nobody)/",$this->acceptRules['groups'][$_group])) continue;
if (in_array($this->acceptRules['groups'][$_group],$this->acceptRules['persistent'][$profile]['groups'])) {
$_checked="checked";
} else {
$_checked="";
}
$_name="groups_".$profile."[]";
printf (" %s ",
$_name,
$this->acceptRules['groups'][$_group],
$profile,
$_checked,
$this->PhonebookGroups[$this->acceptRules['groups'][$_group]]
);
}
}
print " |
";
}
print " ";
print "
";
print "
";
print "
";
print $this->hiddenElements;
print "
";
$chapter=sprintf(_("Rejected Callers"));
$this->showChapter($chapter);
print "
";
print "
";
print _("Use %Number@% to match PSTN numbers and user@domain to match SIP Addresses");
print "
";
if ($this->getRejectMembers()) {
foreach ($this->rejectMembers as $_member) {
$j++;
$rr=floor($j/2);
$mod=$j-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
print "
";
print " ";
print "
";
print " ";
}
}
print "";
print " ";
print "
";
print " ";
print "";
print "
";
print " ";
print "
";
print $this->hiddenElements;
print "
";
}
function deleteAccount($skip_html=False) {
dprint ("SipSettings->deleteAccount($this->account, $this->email)");
$this->getBalanceHistory();
if (count($this->balance_history) != "0" && $this->login_type == 'subscriber') {
return false;
}
if (!$this->email && !$skip_html) {
print "";
print _("Please fill in the e-mail address. ");
print "";
return false;
}
$subject = sprintf("Removal of SIP account %s",$this->account);
//$this->expire_date = new DateTime('now');
$this->expire_date = date("Y-m-d H:i:s",strtotime("+2 days"));
$this->ip = $_SERVER['REMOTE_ADDR'];
$tpl_html = $this->getEmailDeleteTemplateHTML($this->reseller, $this->Preferences['language']);
//dprint("$tpl_html");
if (!$tpl_html && !$skip_html) {
print " ";
print _("Error: no HTML email template found");
print "";
return false;
}
//print "$tpl_html";
define("SMARTY_DIR", "/usr/share/php/smarty/libs/");
include_once(SMARTY_DIR . 'Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = '.';
//$smarty->use_sub_dirs = true;
//$smarty->cache_dir = 'templates_c';
$smarty->assign('client', $this);
//print"$this->sip_settings_page";
if ($tpl_html) {
$bodyhtml = $smarty->fetch($tpl_html);
}
include_once 'Mail.php';
include_once 'Mail/mime.php' ;
$hdrs = array(
'From' => $this->support_email,
'Subject' => $subject,
// 'Cc' => $this->support_email
);
//dprint("1");
$crlf = "\n";
$mime = new Mail_mime($crlf);
if ($tpl_html) {
$mime->setHTMLBody($bodyhtml);
}
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
if ($mail->send($this->email, $hdrs, $body)) {
if (!$skip_html) {
$this->Preferences['account_delete_request']=1;
$this->saveSettings();
$this->getAccount($this->account);
print " ";
printf (_("Removal email has been sent to %s"), $this->email);
}
return 1;
}
}
function sendEmail($skip_html=False) {
dprint ("SipSettings->sendEmail($this->email)");
$this->getVoicemail();
$this->getEnumMappings();
$this->getAliases();
$this->countAliases=count($this->aliases);
if (!$this->email && !$skip_html) {
print " ";
print _("Please fill in the e-mail address. ");
print "";
return false;
}
$subject = sprintf("SIP Account settings %s",$this->account);
//if ($_REQUEST['sip_filter'] == '1') {
// $identifier = $this->RandomIdentifier();
//}
$tpl = $this->getEmailTemplate($this->reseller, $this->Preferences['language']);
if (!$tpl && !$skip_html) {
print " ";
print _("Error: no email template found");
print "";
return false;
}
$tpl_html = $this->getEmailTemplateHTML($this->reseller, $this->Preferences['language']);
//if (!$tpl_html && !$skip_html) {
// print " ";
// print _("Error: no HTML email template found");
// print "";
//}
if (!$this->store_clear_text_password) {
$web_password = '';
}
if (in_array("free-pstn",$this->groups)) $this->allowPSTN=1; // used by smarty
define("SMARTY_DIR", "/usr/share/php/smarty/libs/");
include_once(SMARTY_DIR . 'Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = '.';
//$smarty->use_sub_dirs = true;
//$smarty->cache_dir = 'templates_c';
$smarty->assign('client', $this);
$bodyt = $smarty->fetch($tpl);
if ($tpl_html) {
$bodyhtml = $smarty->fetch($tpl_html);
}
include_once 'Mail.php';
include_once 'Mail/mime.php' ;
$hdrs = array(
'From' => $this->support_email,
'Subject' => $subject
);
$crlf = "\n";
$mime = new Mail_mime($crlf);
$mime->setTXTBody($bodyt);
if ($tpl_html) {
$mime->setHTMLBody($bodyhtml);
}
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
//dprint_r($_REQUEST);
if ($mail->send($this->email, $hdrs, $body)) {
if (!$skip_html) {
print " ";
printf (_("SIP settings have been sent to %s"), $this->email);
}
if ($_REQUEST['password_reset'] == 'on') {
$this->sendPasswordReset($skip_html);
}
return 1;
}
}
function sendChangedEmail($skip_html=False, $fields=array()) {
dprint ("SipSettings->sendChangedEmail($this->email)");
//dprint_r($fields);
$this->ip = $_SERVER['REMOTE_ADDR'];
if (!$this->email && !$skip_html) {
print " ";
print _("Please fill in the e-mail address. ");
print "";
return false;
}
//$this->location = "Unknown";
$_loc=geoip_record_by_name($_SERVER['REMOTE_ADDR']);
if ($_loc['country_name']) {
$this->location = $_loc['country_name'];
}
$subject = sprintf("SIP Account %s changed",$this->account);
$tpl = $this->getChangedEmailTemplate($this->reseller, $this->Preferences['language']);
if (!$tpl && !$skip_html) {
print " ";
print _("Error: no email template found");
print "";
return false;
}
$tpl_html = $this->getChangedEmailTemplateHTML($this->reseller, $this->Preferences['language']);
define("SMARTY_DIR", "/usr/share/php/smarty/libs/");
include_once(SMARTY_DIR . 'Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = '.';
//$smarty->use_sub_dirs = true;
//$smarty->cache_dir = 'templates_c';
$this->fields = $fields;
$smarty->assign('client', $this);
$bodyt = $smarty->fetch($tpl);
if ($tpl_html) {
$bodyhtml = $smarty->fetch($tpl_html);
}
include_once 'Mail.php';
include_once 'Mail/mime.php' ;
$hdrs = array(
'From' => $this->support_email,
'Subject' => $subject
);
$crlf = "\n";
$mime = new Mail_mime($crlf);
$mime->setTXTBody($bodyt);
if ($tpl_html) {
$mime->setHTMLBody($bodyhtml);
}
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
//dprint_r($_REQUEST);
if ($mail->send($this->email, $hdrs, $body)) {
return 1;
}
}
function sendRemoveAccount() {
$this->ip = $_SERVER['REMOTE_ADDR'];
$subject=sprintf ("The account %s was removed from IP Address: %s",$this->account, $this->ip);
syslog(LOG_NOTICE, $subject);
}
function sendPasswordReset($skip_html=False) {
dprint ("SipSettings->sendPasswordEmail($this->email)");
$identifier = RandomIdentifier();
$this->db = new DB_CDRTool();
$this->ip = $_SERVER['REMOTE_ADDR'];
$insert_data = array (
'sip_account' => $this->account,
'email' => $this->email,
'ip' => $this->ip
);
$this->expire=date("Y-m-d H:i:s",strtotime("+30 minutes"));
$query=sprintf("insert into memcache set `key`='email_%s', `value`='%s', `expire`='%s'",
$identifier,
json_encode($insert_data),
$this->expire );
$this->db->query($query);
$this->identifier = $identifier;
dprint("$query Identifier: $identifier");
if (!$this->email && !$skip_html) {
print " ";
print _("Please fill in the e-mail address. ");
print "";
return false;
}
$subject = sprintf("Password reset for %s",$this->account);
$tpl_html = $this->getEmailPasswordTemplateHTML($this->reseller, $this->Preferences['language']);
define("SMARTY_DIR", "/usr/share/php/smarty/libs/");
include_once(SMARTY_DIR . 'Smarty.class.php');
$smarty = new Smarty;
$smarty->template_dir = '.';
//$smarty->use_sub_dirs = true;
//$smarty->cache_dir = 'templates_c';
$smarty->assign('client', $this);
$bodyhtml = $smarty->fetch($tpl_html);
include_once 'Mail.php';
include_once 'Mail/mime.php' ;
$hdrs = array(
'From' => $this->support_email,
'Subject' => $subject
);
$crlf = "\n";
$mime = new Mail_mime($crlf);
$mime->setHTMLBody($bodyhtml);
$body = $mime->get();
$hdrs = $mime->headers($hdrs);
$mail =& Mail::factory('mail');
//dprint_r($_REQUEST);
if ($mail->send($this->email, $hdrs, $body) && !$skip_html) {
print " ";
printf (_("Password reset has been sent to %s"), $this->email);
print "";
}
return 1;
}
function checkSettings() {
dprint ("checkSettings()");
foreach ($this->form_elements as $el) {
${$el}=trim($_REQUEST[$el]);
}
if ($accept_temporary_remain && !is_numeric($accept_temporary_remain)) {
$this->error=_("Invalid Expiration Period");
return false;
}
if ($quota && !is_numeric($quota) && !is_float($quota)) {
$this->error=_("Invalid Quota");
return false;
}
if (!$timezone && !$this->timezone) {
$this->error=_("Missing Timezone");
return false;
}
if (!$this->checkEmail($mailto)) {
$this->error=_("Invalid E-mail Address");
return false;
}
$rpid=preg_replace("/[^0-9\x]/","",$rpid);
if (preg_match("/^0+([1-9]\d*)$/",$rpid,$m)) $rpid=$m[1];
$quickdial=preg_replace("/[^0-9]/","",$quickdial);
if (!strlen($accept_temporary_group)) $accept_temporary_remain=0;
if (!$accept_temporary_remain) $accept_temporary_group="";
if (!$anonymous) $anonymous="0";
return true;
}
function RandomPassword($len=6) {
$alf=array("1","2","3","4","5","6","7","8","9");
$i=0;
while($i < $len) {
srand((double)microtime(true)*1000000);
$randval = rand(0,8);
$string="$string"."$alf[$randval]";
$i++;
}
return $string;
}
function cleanURI($uri) {
$uri=preg_replace("/.*sips?:([^;><=]+).*/", "\$1", $uri);
return urlencode($uri);
}
function showUpgradeTab () {
}
function PhoneDialURL($uri) {
$uri=$this->normalizeURI($uri);
if (!preg_match("/^sip:/",$uri)) {
$uri="sip:".$uri;
}
$uri_print="$this->call_img";
return $uri_print;
}
function showChapter($chapter) {
print "
";
print $chapter;
print "
";
}
function normalizeURI($uri) {
$uri=quoted_printable_decode($uri);
$uri=preg_replace("/.*(sips?:[^;><=]+).*/", "\$1", $uri);
if (preg_match("/^(sips?:.*):/", $uri, $m)) $uri=$m[1];
if (preg_match("/^(.*sips?:0\d+)@(.*)(>?)$/",$uri,$m)) {
$uri=$m[1]."@".$this->domain.$m[3];
}
return $uri;
}
function htmlURI($uri) {
if (preg_match("/^sips?:00(\d+)@/",$uri,$m)) {
$uri="+".$m[1];
}
return htmlentities($uri);
}
function colorizeDate($call_date) {
list($date,$time)=explode(" ",$call_date);
if ($date== Date("Y-m-d",time())) {
$datePrint="".sprintf(_("Today"))." ".$time;
} else if ($date== Date("Y-m-d",time()-3600*24)) {
$datePrint="".sprintf(_("Yesterday"))." ".$time;
} else {
$datePrint=$call_date;
}
return $datePrint;
}
function checkEmail($email) {
dprint ("checkEmail($email)");
$regexp = "/^([a-z0-9][a-z0-9_.-]*)@([a-z0-9][a-z0-9-]*\.)+([a-z]{2,})$/i";
if (stristr($email,"-.") ||
!preg_match($regexp, $email)) {
return false;
}
return true;
}
function getFileTemplate($name, $type="file") {
dprint("getFileTemplate(name=$name, type=$type, path=$this->templates_path)");
if ($type=='logo') {
$extensions=array('png','gif','jpg');
foreach ($extensions as $_ext) {
$file=$this->templates_path.'/'.$this->reseller.'/'.$name.'.'.$_ext;
if (file_exists($file)) {
return $file;
}
}
foreach ($extensions as $_ext) {
if (file_exists("$this->templates_path/default/$name.$_ext")) {
return "$this->templates_path/default/$name.$_ext";
}
}
return false;
} else {
if (file_exists("$this->templates_path/$this->reseller/$name")) {
return "$this->templates_path/$this->reseller/$name";
} elseif (file_exists("$this->templates_path/default/$name")) {
return "$this->templates_path/default/$name";
} else {
return false;
}
}
}
function getEmailTemplate($reseller, $language='en') {
$file = "sip_settings_email_$language.tpl";
$file2 = "sip_settings_email.tpl";
//print("templates_path = $this->templates_path");
if (file_exists("$this->templates_path/$this->reseller/$file")) {
return "$this->templates_path/$this->reseller/$file";
} elseif (file_exists("$this->templates_path/$this->reseller/$file2")) {
return "$this->templates_path/$this->reseller/$file2";
} elseif (file_exists("$this->templates_path/default/$file")) {
return "$this->templates_path/default/$file";
} elseif (file_exists("$this->templates_path/default/$file2")) {
return "$this->templates_path/default/$file2";
} else {
return false;
}
}
function getEmailTemplateHTML($reseller, $language='en') {
$file = "sip_settings_email_$language.html.tpl";
$file2 = "sip_settings_email.html.tpl";
//print("templates_path = $this->templates_path");
if (file_exists("$this->templates_path/$this->reseller/$file")) {
return "$this->templates_path/$this->reseller/$file";
} elseif (file_exists("$this->templates_path/$this->reseller/$file2")) {
return "$this->templates_path/$this->reseller/$file2";
} elseif (file_exists("$this->templates_path/default/$file")) {
return "$this->templates_path/default/$file";
} elseif (file_exists("$this->templates_path/default/$file2")) {
return "$this->templates_path/default/$file2";
} else {
return false;
}
}
function getChangedEmailTemplate($reseller, $language='en') {
$file = "sip_settings_changed_$language.tpl";
$file2 = "sip_settings_changed.tpl";
//print("templates_path = $this->templates_path");
if (file_exists("$this->templates_path/$this->reseller/$file")) {
return "$this->templates_path/$this->reseller/$file";
} elseif (file_exists("$this->templates_path/$this->reseller/$file2")) {
return "$this->templates_path/$this->reseller/$file2";
} elseif (file_exists("$this->templates_path/default/$file")) {
return "$this->templates_path/default/$file";
} elseif (file_exists("$this->templates_path/default/$file2")) {
return "$this->templates_path/default/$file2";
} else {
return false;
}
}
function getChangedEmailTemplateHTML($reseller, $language='en') {
$file = "sip_settings_changed_$language.html.tpl";
$file2 = "sip_settings_changed.html.tpl";
//print("templates_path = $this->templates_path");
if (file_exists("$this->templates_path/$this->reseller/$file")) {
return "$this->templates_path/$this->reseller/$file";
} elseif (file_exists("$this->templates_path/$this->reseller/$file2")) {
return "$this->templates_path/$this->reseller/$file2";
} elseif (file_exists("$this->templates_path/default/$file")) {
return "$this->templates_path/default/$file";
} elseif (file_exists("$this->templates_path/default/$file2")) {
return "$this->templates_path/default/$file2";
} else {
return false;
}
}
function getEmailPasswordTemplateHTML($reseller, $language='en') {
$file = "password_reminder_$language.html.tpl";
$file2 = "password_reminder.html.tpl";
//print("templates_path = $this->templates_path");
if (file_exists("$this->templates_path/$this->reseller/$file")) {
return "$this->templates_path/$this->reseller/$file";
} elseif (file_exists("$this->templates_path/$this->reseller/$file2")) {
return "$this->templates_path/$this->reseller/$file2";
} elseif (file_exists("$this->templates_path/default/$file")) {
return "$this->templates_path/default/$file";
} elseif (file_exists("$this->templates_path/default/$file2")) {
return "$this->templates_path/default/$file2";
} else {
return false;
}
}
function getEmailDeleteTemplateHTML($reseller, $language='en') {
$file = "delete_$language.html.tpl";
$file2 = "delete.html.tpl";
//print("templates_path = $this->templates_path");
if (file_exists("$this->templates_path/$this->reseller/$file")) {
return "$this->templates_path/$this->reseller/$file";
} elseif (file_exists("$this->templates_path/$this->reseller/$file2")) {
return "$this->templates_path/$this->reseller/$file2";
} elseif (file_exists("$this->templates_path/default/$file")) {
return "$this->templates_path/default/$file";
} elseif (file_exists("$this->templates_path/default/$file2")) {
return "$this->templates_path/default/$file2";
} else {
return false;
}
}
function getBillingProfiles() {
dprint("getBillingProfiles()");
// Get getBillingProfiles
$this->RatingPort->addHeader($this->SoapAuthRating);
$result = $this->RatingPort->getEntityProfiles("subscriber://".$this->account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "4001") {
printf ("Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
$this->billingProfiles=$result;
}
function showBillingProfiles() {
if ($this->login_type != 'reseller' && $this->login_type != 'admin') {
return false;
}
if (!$this->pstn_changes_allowed) {
return false;
}
$this->getBillingProfiles();
$chapter=sprintf(_("Billing Profiles"));
$this->showChapter($chapter);
print "
";
print "
";
print "
");
if ($this->billingProfiles->timezone) {
$_timezone=$this->billingProfiles->timezone;
} else {
$_timezone=$this->resellerProperties['timezone'];
}
$this->showTimezones('profileTimezone',$_timezone);
print "
";
}
function updateBillingProfiles() {
if ($this->login_type != 'reseller' && $this->login_type != 'admin') {
return false;
}
if (!$this->pstn_changes_allowed) {
return true;
}
$this->RatingPort->addHeader($this->SoapAuthRating);
$result = $this->RatingPort->getEntityProfiles("subscriber://".$this->account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "4001") {
printf ("Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
$this->billingProfiles=$result;
$profiles=array("entity" =>'subscriber://'.$this->account ,
"profileWeekday" => trim($_REQUEST['profileWeekday']),
"profileWeekdayAlt" => trim($_REQUEST['profileWeekdayAlt']),
"profileWeekend" => trim($_REQUEST['profileWeekend']),
"profileWeekendAlt" => trim($_REQUEST['profileWeekendAlt']),
"timezone" => trim($_REQUEST['profileTimezone'])
);
//print_r($profiles);
$this->RatingPort->addHeader($this->SoapAuthRating);
if ($this->billingProfiles->profileWeekday && !$profiles['profileWeekday']) {
// delete profile
$result = $this->RatingPort->deleteEntityProfiles('subscriber://'.$this->account);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "4001") {
printf (" Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
} else if ($profiles['profileWeekday']) {
// update profile
$result = $this->RatingPort->setEntityProfiles($profiles);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode != "4001") {
printf (" Error (Rating): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
}
}
}
function getImageForUserAgent($agent) {
// array with mappings between User Agents and images
foreach ($this->userAgentImages as $agentRegexp => $image) {
if (preg_match("/$agentRegexp/i", $agent)) {
return $image;
}
}
return "unknown.png";
}
function showExtraGroups () {
if ($this->disable_extra_groups) return true;
$foundGroupInAvailableGroups=array();
foreach ($this->groups as $_grp) {
foreach (array_keys($this->availableGroups) as $a_grp) {
if ($_grp == $a_grp) $foundGroupInAvailableGroups[]=$_grp;
continue;
}
}
$extraGroups = array_unique(array_diff($this->groups,$foundGroupInAvailableGroups));
foreach ($extraGroups as $_eg) {
$extraGroups_text.=$_eg.' ';
}
if ($this->login_type == 'subscriber') {
printf ("",trim($extraGroups_text));
} else {
print "
";
}
}
function generateCertificate() {
global $enrollment;
include("/etc/cdrtool/enrollment/config.ini");
if (!is_array($enrollment)) {
print _("Error: missing enrollment settings");
return false;
}
if (!$enrollment['ca_conf']) {
//print _("Error: missing enrollment ca_conf settings");
return false;
}
if (!$this->owner) {
return false;
}
if (!$enrollment['ca_crt']) {
//print _("Error: missing enrollment ca_crt settings");
return false;
}
if (!$enrollment['ca_key']) {
//print _("Error: missing enrollment ca_key settings");
return false;
}
$config = array(
'config' => $enrollment['ca_conf'],
'digest_alg' => 'md5',
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
'encrypt_key' => false,
);
$dn = array(
"countryName" => "NL",
"stateOrProvinceName" => "Noord Holland",
"localityName" => "Haarlem",
"organizationName" => "AG Projects",
"organizationalUnitName" => "Blink",
"commonName" => $this->owner,
"emailAddress" => $this->email
);
$this->key = openssl_pkey_new($config);
if ($this->key==FALSE) {
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
print "
";
}
return false;
}
$this->csr = openssl_csr_new($dn, $this->key);
if (!$this->csr) {
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
print "
";
}
return false;
}
$ca="file://".$enrollment['ca_crt'];
$this->crt = openssl_csr_sign($this->csr, $ca, $enrollment['ca_key'], 3650, $config);
if ($this->crt==FALSE) {
while (($e = openssl_error_string()) !== false) {
echo $e . "\n";
print "
";
}
return false;
}
openssl_csr_export ($this->csr, $this->csr_out);
openssl_pkey_export ($this->key, $this->key_out, $this->password, $config);
openssl_x509_export ($this->crt, $this->crt_out);
openssl_pkcs12_export ($this->crt, $this->p12_out, $this->key, $this->password);
$ret=array( 'csr' => $this->csr_out,
'crt' => $this->crt_out,
'key' => $this->key_out,
'pkey'=> $public_key,
'p12' => $this->p12_out,
'ca' => file_get_contents($enrollment['ca_crt'])
);
return $ret;
}
function exportCertificateX509() {
if (!$this->owner) return;
Header("Content-type: application/x-crt");
$header=sprintf("Content-Disposition: inline; filename=sipthor-owner-certificate-%s.crt",$this->owner);
Header($header);
$cert=$this->generateCertificate();
$crt=$cert['crt'].$cert['key'];
print $crt;
}
function exportCertificateP12() {
if (!$this->owner) return;
$cert=$this->generateCertificate();
Header("Content-type: application/x-p12");
$header=sprintf("Content-Disposition: inline; filename=sipthor-owner-certificate-%s.p12",$this->owner);
Header($header);
print $cert['p12'];
}
function isEmbedded() {
// return true if page was loaded from non-session based web session
if ($_SERVER['SSL_CLIENT_CERT'] || $_SERVER['PHP_AUTH_DIGEST']) {
return true;
}
return false;
}
function changeLanguage($lang='en',$domain='cdrtool') {
// run dpkg-reconfigure locales and select support languages .utf8
$lang = $this->languageCodeFor(isset($lang) ? $lang : 'en');
$lang.='.utf8';
setlocale(LC_ALL, $lang);
bindtextdomain($domain, '/var/www/CDRTool/po/locale');
bind_textdomain_codeset($domain,'UTF-8');
textdomain($domain);
}
// return full language code for given 2 letter language code
function languageCodeFor($lang='en') {
$lang = isset($lang) ? strtolower($lang) : 'en';
switch ($lang) {
case 'en': return 'en_US'; // this can be C or en_US
case 'ja': return 'ja_JP';
default : return ($lang . '_' . strtoupper($lang));
}
return 'C'; // this will never be reached
}
function showDirectorySearchForm () {
print "
url method=post>
";
print $this->hiddenElements;
print "
";
}
function showSearchDirectory() {
if (!$this->show_directory) {
return false;
}
$this->maxrowsperpage=20;
$this->showDirectorySearchForm();
if ($_REQUEST['firstname'] || $_REQUEST['lastname']) {
if ($_REQUEST['firstname'] && strlen($_REQUEST['firstname']) < 3) {
return false;
}
if ($_REQUEST['lastname'] && strlen($_REQUEST['lastname']) < 3) {
return false;
}
} else {
return false;
}
$this->next = $_REQUEST['next'];
// Filter
$filter=array('firstName'=> trim($_REQUEST['firstname']),
'lastName' => trim($_REQUEST['lastname'])
);
// Range
$range=array('start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SipPort->addHeader($this->SoapAuthAdmin);
// Call function
$result = $this->SipPort->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error from %s: %s (%s): %s",$this->SoapEngine->SOAPurl,$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
$this->rows = $result->total;
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows=$this->rows;
}
if ($this->rows) {
print "
";
printf(_("%s contacts found. "),$this->rows);
if ($this->isEmbedded()) {
//printf (_("Click on %s to add a Contact to Blink. "),$this->plus_sign_img);
}
print "
| ";
print "";
print _('Display Name');
print " | ";
print "";
print _('SIP Address');
print " | ";
print "";
print _('Timezone');
print " | ";
print "";
print _('Action');
print " | ";
print "
";
$i=0;
while ($i < $maxrows) {
if (!$result->accounts[$i]) break;
$account = $result->accounts[$i];
$index=$this->next+$i+1;
$rr=floor($index/2);
$mod=$index-$rr*2;
if ($mod ==0) {
$_class='odd';
} else {
$_class='even';
}
$i++;
$name=$account->firstName.' '.$account->lastName;
$sip_account=sprintf("%s@%s",$account->id->username,$account->id->domain);
$contacts_url=sprintf("%s",$this->url,$sip_account,urlencode($name),$sip_account,$this->phonebook_img);
if ($this->isEmbedded()) {
//$add_contact_url=sprintf("%s",$sip_account,$name,$this->plus_sign_img);
printf ("%d | %s | %s | %s | %s %s | ",
$_class,
$index,
$name,
$sip_account,
$account->timezone,
$this->PhoneDialURL($sip_account),
$add_contact_url
);
} else {
printf (" %d | %s | %s | %s | %s %s | ",
$_class,
$index,
$name,
$sip_account,
$account->timezone,
$this->PhoneDialURL($sip_account),
$contacts_url
);
}
}
print " ";
$this->showPagination($maxrows);
return true;
}
}
function showPagination($maxrows) {
$url = sprintf("%s&tab=%s&firstname=%s&lastname%s",
$this->url,
$this->tab,
urlencode($_REQUEST['firstname']),
urlencode($_REQUEST['lastname'])
);
print "
";
if ($this->next != 0 ) {
$show_next=$this->maxrowsperpage-$this->next;
if ($show_next < 0) {
$mod_show_next = $show_next-2*$show_next;
}
if (!$mod_show_next) $mod_show_next=0;
if ($mod_show_next/$this->maxrowsperpage >= 1) {
printf ("Begin ",$url);
}
printf ("Previous ",$url,$mod_show_next);
}
print "
|
";
if ($this->next + $this->maxrowsperpage < $this->rows) {
$show_next = $this->maxrowsperpage + $this->next;
printf ("Next ",$url,$show_next);
}
print "
|
";
}
}
function lookupGeoLocation($ip) {
if ($_loc=geoip_record_by_name($ip)) {
$_loc['timezone'] = get_time_zone($_loc['country_code'], $_loc['region']);
$_loc['region'] = get_region($_loc['country_code'], $_loc['region']);
$country_transition = array(
"A1" => "N/A",
"A2" => "N/A",
"O1" => "N/A",
"AP" => "N/A",
"GB" => "UK");
if (array_key_exists($_loc['country_code'],$country_transition)) {
$_loc['country_code'] = $country_transition[$_loc['country_code']];
}
return $_loc;
} else {
return array();
}
}
function get_region($country, $region) {
if ($country == "US" || $country =="CA" ) {
$full_region = $region;
// If region can't be found make it a default region to prevent NGNpro error
if ($full_region == '' && $country == "US") {
$full_region = "NY";
} else if ($full_region == '' && $country == "CA") {
$full_region = "QC";
}
} else {
$full_region='';
}
return $full_region;
}
function get_time_zone($country, $region) {
switch ($country) {
case "US":
switch ($region) {
case "AL":
$timezone = "America/Chicago";
break;
case "AK":
$timezone = "America/Anchorage";
break;
case "AZ":
$timezone = "America/Phoenix";
break;
case "AR":
$timezone = "America/Chicago";
break;
case "CA":
$timezone = "America/Los_Angeles";
break;
case "CO":
$timezone = "America/Denver";
break;
case "CT":
$timezone = "America/New_York";
break;
case "DE":
$timezone = "America/New_York";
break;
case "DC":
$timezone = "America/New_York";
break;
case "FL":
$timezone = "America/New_York";
break;
case "GA":
$timezone = "America/New_York";
break;
case "HI":
$timezone = "Pacific/Honolulu";
break;
case "ID":
$timezone = "America/Denver";
break;
case "IL":
$timezone = "America/Chicago";
break;
case "IN":
$timezone = "America/Indianapolis";
break;
case "IA":
$timezone = "America/Chicago";
break;
case "KS":
$timezone = "America/Chicago";
break;
case "KY":
$timezone = "America/New_York";
break;
case "LA":
$timezone = "America/Chicago";
break;
case "ME":
$timezone = "America/New_York";
break;
case "MD":
$timezone = "America/New_York";
break;
case "MA":
$timezone = "America/New_York";
break;
case "MI":
$timezone = "America/New_York";
break;
case "MN":
$timezone = "America/Chicago";
break;
case "MS":
$timezone = "America/Chicago";
break;
case "MO":
$timezone = "America/Chicago";
break;
case "MT":
$timezone = "America/Denver";
break;
case "NE":
$timezone = "America/Chicago";
break;
case "NV":
$timezone = "America/Los_Angeles";
break;
case "NH":
$timezone = "America/New_York";
break;
case "NJ":
$timezone = "America/New_York";
break;
case "NM":
$timezone = "America/Denver";
break;
case "NY":
$timezone = "America/New_York";
break;
case "NC":
$timezone = "America/New_York";
break;
case "ND":
$timezone = "America/Chicago";
break;
case "OH":
$timezone = "America/New_York";
break;
case "OK":
$timezone = "America/Chicago";
break;
case "OR":
$timezone = "America/Los_Angeles";
break;
case "PA":
$timezone = "America/New_York";
break;
case "RI":
$timezone = "America/New_York";
break;
case "SC":
$timezone = "America/New_York";
break;
case "SD":
$timezone = "America/Chicago";
break;
case "TN":
$timezone = "America/Chicago";
break;
case "TX":
$timezone = "America/Chicago";
break;
case "UT":
$timezone = "America/Denver";
break;
case "VT":
$timezone = "America/New_York";
break;
case "VA":
$timezone = "America/New_York";
break;
case "WA":
$timezone = "America/Los_Angeles";
break;
case "WV":
$timezone = "America/New_York";
break;
case "WI":
$timezone = "America/Chicago";
break;
case "WY":
$timezone = "America/Denver";
break;
}
break;
case "CA":
switch ($region) {
case "AB":
$timezone = "America/Edmonton";
break;
case "BC":
$timezone = "America/Vancouver";
break;
case "MB":
$timezone = "America/Winnipeg";
break;
case "NB":
$timezone = "America/Halifax";
break;
case "NL":
$timezone = "America/St_Johns";
break;
case "NT":
$timezone = "America/Yellowknife";
break;
case "NS":
$timezone = "America/Halifax";
break;
case "NU":
$timezone = "America/Rankin_Inlet";
break;
case "ON":
$timezone = "America/Rainy_River";
break;
case "PE":
$timezone = "America/Halifax";
break;
case "QC":
$timezone = "America/Montreal";
break;
case "SK":
$timezone = "America/Regina";
break;
case "YT":
$timezone = "America/Whitehorse";
break;
}
break;
case "AU":
switch ($region) {
case "01":
$timezone = "Australia/Canberra";
break;
case "02":
$timezone = "Australia/NSW";
break;
case "03":
$timezone = "Australia/North";
break;
case "04":
$timezone = "Australia/Queensland";
break;
case "05":
$timezone = "Australia/South";
break;
case "06":
$timezone = "Australia/Tasmania";
break;
case "07":
$timezone = "Australia/Victoria";
break;
case "08":
$timezone = "Australia/West";
break;
}
break;
case "AS":
$timezone = "US/Samoa";
break;
case "CI":
$timezone = "Africa/Abidjan";
break;
case "GH":
$timezone = "Africa/Accra";
break;
case "DZ":
$timezone = "Africa/Algiers";
break;
case "ER":
$timezone = "Africa/Asmera";
break;
case "ML":
$timezone = "Africa/Bamako";
break;
case "CF":
$timezone = "Africa/Bangui";
break;
case "GM":
$timezone = "Africa/Banjul";
break;
case "GW":
$timezone = "Africa/Bissau";
break;
case "CG":
$timezone = "Africa/Brazzaville";
break;
case "BI":
$timezone = "Africa/Bujumbura";
break;
case "EG":
$timezone = "Africa/Cairo";
break;
case "MA":
$timezone = "Africa/Casablanca";
break;
case "GN":
$timezone = "Africa/Conakry";
break;
case "SN":
$timezone = "Africa/Dakar";
break;
case "DJ":
$timezone = "Africa/Djibouti";
break;
case "SL":
$timezone = "Africa/Freetown";
break;
case "BW":
$timezone = "Africa/Gaborone";
break;
case "ZW":
$timezone = "Africa/Harare";
break;
case "ZA":
$timezone = "Africa/Johannesburg";
break;
case "UG":
$timezone = "Africa/Kampala";
break;
case "SD":
$timezone = "Africa/Khartoum";
break;
case "RW":
$timezone = "Africa/Kigali";
break;
case "NG":
$timezone = "Africa/Lagos";
break;
case "GA":
$timezone = "Africa/Libreville";
break;
case "TG":
$timezone = "Africa/Lome";
break;
case "AO":
$timezone = "Africa/Luanda";
break;
case "ZM":
$timezone = "Africa/Lusaka";
break;
case "GQ":
$timezone = "Africa/Malabo";
break;
case "MZ":
$timezone = "Africa/Maputo";
break;
case "LS":
$timezone = "Africa/Maseru";
break;
case "SZ":
$timezone = "Africa/Mbabane";
break;
case "SO":
$timezone = "Africa/Mogadishu";
break;
case "LR":
$timezone = "Africa/Monrovia";
break;
case "KE":
$timezone = "Africa/Nairobi";
break;
case "TD":
$timezone = "Africa/Ndjamena";
break;
case "NE":
$timezone = "Africa/Niamey";
break;
case "MR":
$timezone = "Africa/Nouakchott";
break;
case "BF":
$timezone = "Africa/Ouagadougou";
break;
case "ST":
$timezone = "Africa/Sao_Tome";
break;
case "LY":
$timezone = "Africa/Tripoli";
break;
case "TN":
$timezone = "Africa/Tunis";
break;
case "AI":
$timezone = "America/Anguilla";
break;
case "AG":
$timezone = "America/Antigua";
break;
case "AW":
$timezone = "America/Aruba";
break;
case "BB":
$timezone = "America/Barbados";
break;
case "BZ":
$timezone = "America/Belize";
break;
case "CO":
$timezone = "America/Bogota";
break;
case "VE":
$timezone = "America/Caracas";
break;
case "KY":
$timezone = "America/Cayman";
break;
case "CR":
$timezone = "America/Costa_Rica";
break;
case "DM":
$timezone = "America/Dominica";
break;
case "SV":
$timezone = "America/El_Salvador";
break;
case "GD":
$timezone = "America/Grenada";
break;
case "FR":
$timezone = "Europe/Paris";
break;
case "GP":
$timezone = "America/Guadeloupe";
break;
case "GT":
$timezone = "America/Guatemala";
break;
case "GY":
$timezone = "America/Guyana";
break;
case "CU":
$timezone = "America/Havana";
break;
case "JM":
$timezone = "America/Jamaica";
break;
case "BO":
$timezone = "America/La_Paz";
break;
case "PE":
$timezone = "America/Lima";
break;
case "NI":
$timezone = "America/Managua";
break;
case "MQ":
$timezone = "America/Martinique";
break;
case "UY":
$timezone = "America/Montevideo";
break;
case "MS":
$timezone = "America/Montserrat";
break;
case "BS":
$timezone = "America/Nassau";
break;
case "PA":
$timezone = "America/Panama";
break;
case "SR":
$timezone = "America/Paramaribo";
break;
case "PR":
$timezone = "America/Puerto_Rico";
break;
case "KN":
$timezone = "America/St_Kitts";
break;
case "LC":
$timezone = "America/St_Lucia";
break;
case "VC":
$timezone = "America/St_Vincent";
break;
case "HN":
$timezone = "America/Tegucigalpa";
break;
case "YE":
$timezone = "Asia/Aden";
break;
case "JO":
$timezone = "Asia/Amman";
break;
case "TM":
$timezone = "Asia/Ashgabat";
break;
case "IQ":
$timezone = "Asia/Baghdad";
break;
case "BH":
$timezone = "Asia/Bahrain";
break;
case "AZ":
$timezone = "Asia/Baku";
break;
case "TH":
$timezone = "Asia/Bangkok";
break;
case "LB":
$timezone = "Asia/Beirut";
break;
case "KG":
$timezone = "Asia/Bishkek";
break;
case "BN":
$timezone = "Asia/Brunei";
break;
case "IN":
$timezone = "Asia/Calcutta";
break;
case "MN":
$timezone = "Asia/Choibalsan";
break;
case "LK":
$timezone = "Asia/Colombo";
break;
case "BD":
$timezone = "Asia/Dhaka";
break;
case "AE":
$timezone = "Asia/Dubai";
break;
case "TJ":
$timezone = "Asia/Dushanbe";
break;
case "HK":
$timezone = "Asia/Hong_Kong";
break;
case "TR":
$timezone = "Asia/Istanbul";
break;
case "IL":
$timezone = "Asia/Jerusalem";
break;
case "AF":
$timezone = "Asia/Kabul";
break;
case "PK":
$timezone = "Asia/Karachi";
break;
case "NP":
$timezone = "Asia/Katmandu";
break;
case "KW":
$timezone = "Asia/Kuwait";
break;
case "MO":
$timezone = "Asia/Macao";
break;
case "PH":
$timezone = "Asia/Manila";
break;
case "OM":
$timezone = "Asia/Muscat";
break;
case "CY":
$timezone = "Asia/Nicosia";
break;
case "KP":
$timezone = "Asia/Pyongyang";
break;
case "QA":
$timezone = "Asia/Qatar";
break;
case "MM":
$timezone = "Asia/Rangoon";
break;
case "SA":
$timezone = "Asia/Riyadh";
break;
case "KR":
$timezone = "Asia/Seoul";
break;
case "SG":
$timezone = "Asia/Singapore";
break;
case "TW":
$timezone = "Asia/Taipei";
break;
case "GE":
$timezone = "Asia/Tbilisi";
break;
case "BT":
$timezone = "Asia/Thimphu";
break;
case "JP":
$timezone = "Asia/Tokyo";
break;
case "LA":
$timezone = "Asia/Vientiane";
break;
case "AM":
$timezone = "Asia/Yerevan";
break;
case "BM":
$timezone = "Atlantic/Bermuda";
break;
case "CV":
$timezone = "Atlantic/Cape_Verde";
break;
case "FO":
$timezone = "Atlantic/Faeroe";
break;
case "IS":
$timezone = "Atlantic/Reykjavik";
break;
case "GS":
$timezone = "Atlantic/South_Georgia";
break;
case "SH":
$timezone = "Atlantic/St_Helena";
break;
case "CL":
$timezone = "Chile/Continental";
break;
case "NL":
$timezone = "Europe/Amsterdam";
break;
case "AD":
$timezone = "Europe/Andorra";
break;
case "GR":
$timezone = "Europe/Athens";
break;
case "YU":
$timezone = "Europe/Belgrade";
break;
case "DE":
$timezone = "Europe/Berlin";
break;
case "SK":
$timezone = "Europe/Bratislava";
break;
case "BE":
$timezone = "Europe/Brussels";
break;
case "RO":
$timezone = "Europe/Bucharest";
break;
case "HU":
$timezone = "Europe/Budapest";
break;
case "DK":
$timezone = "Europe/Copenhagen";
break;
case "IE":
$timezone = "Europe/Dublin";
break;
case "GI":
$timezone = "Europe/Gibraltar";
break;
case "FI":
$timezone = "Europe/Helsinki";
break;
case "SI":
$timezone = "Europe/Ljubljana";
break;
case "GB":
$timezone = "Europe/London";
break;
case "LU":
$timezone = "Europe/Luxembourg";
break;
case "MT":
$timezone = "Europe/Malta";
break;
case "BY":
$timezone = "Europe/Minsk";
break;
case "MC":
$timezone = "Europe/Monaco";
break;
case "NO":
$timezone = "Europe/Oslo";
break;
case "CZ":
$timezone = "Europe/Prague";
break;
case "LV":
$timezone = "Europe/Riga";
break;
case "IT":
$timezone = "Europe/Rome";
break;
case "SM":
$timezone = "Europe/San_Marino";
break;
case "BA":
$timezone = "Europe/Sarajevo";
break;
case "MK":
$timezone = "Europe/Skopje";
break;
case "BG":
$timezone = "Europe/Sofia";
break;
case "SE":
$timezone = "Europe/Stockholm";
break;
case "EE":
$timezone = "Europe/Tallinn";
break;
case "AL":
$timezone = "Europe/Tirane";
break;
case "LI":
$timezone = "Europe/Vaduz";
break;
case "VA":
$timezone = "Europe/Vatican";
break;
case "AT":
$timezone = "Europe/Vienna";
break;
case "LT":
$timezone = "Europe/Vilnius";
break;
case "PL":
$timezone = "Europe/Warsaw";
break;
case "HR":
$timezone = "Europe/Zagreb";
break;
case "IR":
$timezone = "Asia/Tehran";
break;
case "MG":
$timezone = "Indian/Antananarivo";
break;
case "CX":
$timezone = "Indian/Christmas";
break;
case "CC":
$timezone = "Indian/Cocos";
break;
case "KM":
$timezone = "Indian/Comoro";
break;
case "MV":
$timezone = "Indian/Maldives";
break;
case "MU":
$timezone = "Indian/Mauritius";
break;
case "YT":
$timezone = "Indian/Mayotte";
break;
case "RE":
$timezone = "Indian/Reunion";
break;
case "FJ":
$timezone = "Pacific/Fiji";
break;
case "TV":
$timezone = "Pacific/Funafuti";
break;
case "GU":
$timezone = "Pacific/Guam";
break;
case "NR":
$timezone = "Pacific/Nauru";
break;
case "NU":
$timezone = "Pacific/Niue";
break;
case "NF":
$timezone = "Pacific/Norfolk";
break;
case "PW":
$timezone = "Pacific/Palau";
break;
case "PN":
$timezone = "Pacific/Pitcairn";
break;
case "CK":
$timezone = "Pacific/Rarotonga";
break;
case "WS":
$timezone = "Pacific/Samoa";
break;
case "KI":
$timezone = "Pacific/Tarawa";
break;
case "TO":
$timezone = "Pacific/Tongatapu";
break;
case "WF":
$timezone = "Pacific/Wallis";
break;
case "TZ":
$timezone = "Africa/Dar_es_Salaam";
break;
case "VN":
$timezone = "Asia/Phnom_Penh";
break;
case "KH":
$timezone = "Asia/Phnom_Penh";
break;
case "CM":
$timezone = "Africa/Lagos";
break;
case "DO":
$timezone = "America/Santo_Domingo";
break;
case "ET":
$timezone = "Africa/Addis_Ababa";
break;
case "FX":
$timezone = "Europe/Paris";
break;
case "HT":
$timezone = "America/Port-au-Prince";
break;
case "CH":
$timezone = "Europe/Zurich";
break;
case "AN":
$timezone = "America/Curacao";
break;
case "BJ":
$timezone = "Africa/Porto-Novo";
break;
case "EH":
$timezone = "Africa/El_Aaiun";
break;
case "FK":
$timezone = "Atlantic/Stanley";
break;
case "GF":
$timezone = "America/Cayenne";
break;
case "IO":
$timezone = "Indian/Chagos";
break;
case "MD":
$timezone = "Europe/Chisinau";
break;
case "MP":
$timezone = "Pacific/Saipan";
break;
case "MW":
$timezone = "Africa/Blantyre";
break;
case "NA":
$timezone = "Africa/Windhoek";
break;
case "NC":
$timezone = "Pacific/Noumea";
break;
case "PG":
$timezone = "Pacific/Port_Moresby";
break;
case "PM":
$timezone = "America/Miquelon";
break;
case "PS":
$timezone = "Asia/Gaza";
break;
case "PY":
$timezone = "America/Asuncion";
break;
case "SB":
$timezone = "Pacific/Guadalcanal";
break;
case "SC":
$timezone = "Indian/Mahe";
break;
case "SJ":
$timezone = "Arctic/Longyearbyen";
break;
case "SY":
$timezone = "Asia/Damascus";
break;
case "TC":
$timezone = "America/Grand_Turk";
break;
case "TF":
$timezone = "Indian/Kerguelen";
break;
case "TK":
$timezone = "Pacific/Fakaofo";
break;
case "TT":
$timezone = "America/Port_of_Spain";
break;
case "VG":
$timezone = "America/Tortola";
break;
case "VI":
$timezone = "America/St_Thomas";
break;
case "VU":
$timezone = "Pacific/Efate";
break;
case "RS":
$timezone = "Europe/Belgrade";
break;
case "ME":
$timezone = "Europe/Podgorica";
break;
case "AX":
$timezone = "Europe/Mariehamn";
break;
case "GG":
$timezone = "Europe/Guernsey";
break;
case "IM":
$timezone = "Europe/Isle_of_Man";
break;
case "JE":
$timezone = "Europe/Jersey";
break;
case "BL":
$timezone = "America/St_Barthelemy";
break;
case "MF":
$timezone = "America/Marigot";
break;
case "AR":
switch ($region) {
case "01":
$timezone = "America/Argentina/Buenos_Aires";
break;
case "02":
$timezone = "America/Argentina/Catamarca";
break;
case "03":
$timezone = "America/Argentina/Tucuman";
break;
case "04":
$timezone = "America/Argentina/Rio_Gallegos";
break;
case "05":
$timezone = "America/Argentina/Cordoba";
break;
case "06":
$timezone = "America/Argentina/Tucuman";
break;
case "07":
$timezone = "America/Argentina/Buenos_Aires";
break;
case "08":
$timezone = "America/Argentina/Buenos_Aires";
break;
case "09":
$timezone = "America/Argentina/Tucuman";
break;
case "10":
$timezone = "America/Argentina/Jujuy";
break;
case "11":
$timezone = "America/Argentina/San_Luis";
break;
case "12":
$timezone = "America/Argentina/La_Rioja";
break;
case "13":
$timezone = "America/Argentina/Mendoza";
break;
case "14":
$timezone = "America/Argentina/Buenos_Aires";
break;
case "15":
$timezone = "America/Argentina/San_Luis";
break;
case "16":
$timezone = "America/Argentina/Buenos_Aires";
break;
case "17":
$timezone = "America/Argentina/Salta";
break;
case "18":
$timezone = "America/Argentina/San_Juan";
break;
case "19":
$timezone = "America/Argentina/San_Luis";
break;
case "20":
$timezone = "America/Argentina/Rio_Gallegos";
break;
case "21":
$timezone = "America/Argentina/Buenos_Aires";
break;
case "22":
$timezone = "America/Argentina/Catamarca";
break;
case "23":
$timezone = "America/Argentina/Ushuaia";
break;
case "24":
$timezone = "America/Argentina/Tucuman";
break;
}
break;
case "BR":
switch ($region) {
case "01":
$timezone = "America/Rio_Branco";
break;
case "02":
$timezone = "America/Maceio";
break;
case "03":
$timezone = "America/Sao_Paulo";
break;
case "04":
$timezone = "America/Manaus";
break;
case "05":
$timezone = "America/Bahia";
break;
case "06":
$timezone = "America/Fortaleza";
break;
case "07":
$timezone = "America/Sao_Paulo";
break;
case "08":
$timezone = "America/Sao_Paulo";
break;
case "11":
$timezone = "America/Campo_Grande";
break;
case "13":
$timezone = "America/Belem";
break;
case "14":
$timezone = "America/Cuiaba";
break;
case "15":
$timezone = "America/Sao_Paulo";
break;
case "16":
$timezone = "America/Belem";
break;
case "17":
$timezone = "America/Recife";
break;
case "18":
$timezone = "America/Sao_Paulo";
break;
case "20":
$timezone = "America/Fortaleza";
break;
case "21":
$timezone = "America/Sao_Paulo";
break;
case "22":
$timezone = "America/Recife";
break;
case "23":
$timezone = "America/Sao_Paulo";
break;
case "24":
$timezone = "America/Porto_Velho";
break;
case "25":
$timezone = "America/Boa_Vista";
break;
case "26":
$timezone = "America/Sao_Paulo";
break;
case "27":
$timezone = "America/Sao_Paulo";
break;
case "28":
$timezone = "America/Maceio";
break;
case "29":
$timezone = "America/Sao_Paulo";
break;
case "30":
$timezone = "America/Recife";
break;
case "31":
$timezone = "America/Araguaina";
break;
}
break;
case "CD":
switch ($region) {
case "02":
$timezone = "Africa/Kinshasa";
break;
case "05":
$timezone = "Africa/Lubumbashi";
break;
case "06":
$timezone = "Africa/Kinshasa";
break;
case "08":
$timezone = "Africa/Kinshasa";
break;
case "10":
$timezone = "Africa/Lubumbashi";
break;
case "11":
$timezone = "Africa/Lubumbashi";
break;
case "12":
$timezone = "Africa/Lubumbashi";
break;
}
break;
case "CN":
switch ($region) {
case "01":
$timezone = "Asia/Shanghai";
break;
case "02":
$timezone = "Asia/Shanghai";
break;
case "03":
$timezone = "Asia/Shanghai";
break;
case "04":
$timezone = "Asia/Shanghai";
break;
case "05":
$timezone = "Asia/Harbin";
break;
case "06":
$timezone = "Asia/Chongqing";
break;
case "07":
$timezone = "Asia/Shanghai";
break;
case "08":
$timezone = "Asia/Harbin";
break;
case "09":
$timezone = "Asia/Shanghai";
break;
case "10":
$timezone = "Asia/Shanghai";
break;
case "11":
$timezone = "Asia/Chongqing";
break;
case "12":
$timezone = "Asia/Shanghai";
break;
case "13":
$timezone = "Asia/Urumqi";
break;
case "14":
$timezone = "Asia/Chongqing";
break;
case "15":
$timezone = "Asia/Chongqing";
break;
case "16":
$timezone = "Asia/Chongqing";
break;
case "18":
$timezone = "Asia/Chongqing";
break;
case "19":
$timezone = "Asia/Harbin";
break;
case "20":
$timezone = "Asia/Harbin";
break;
case "21":
$timezone = "Asia/Chongqing";
break;
case "22":
$timezone = "Asia/Harbin";
break;
case "23":
$timezone = "Asia/Shanghai";
break;
case "24":
$timezone = "Asia/Chongqing";
break;
case "25":
$timezone = "Asia/Shanghai";
break;
case "26":
$timezone = "Asia/Chongqing";
break;
case "28":
$timezone = "Asia/Shanghai";
break;
case "29":
$timezone = "Asia/Chongqing";
break;
case "30":
$timezone = "Asia/Chongqing";
break;
case "31":
$timezone = "Asia/Chongqing";
break;
case "32":
$timezone = "Asia/Chongqing";
break;
case "33":
$timezone = "Asia/Chongqing";
break;
}
break;
case "EC":
switch ($region) {
case "01":
$timezone = "Pacific/Galapagos";
break;
case "02":
$timezone = "America/Guayaquil";
break;
case "03":
$timezone = "America/Guayaquil";
break;
case "04":
$timezone = "America/Guayaquil";
break;
case "05":
$timezone = "America/Guayaquil";
break;
case "06":
$timezone = "America/Guayaquil";
break;
case "07":
$timezone = "America/Guayaquil";
break;
case "08":
$timezone = "America/Guayaquil";
break;
case "09":
$timezone = "America/Guayaquil";
break;
case "10":
$timezone = "America/Guayaquil";
break;
case "11":
$timezone = "America/Guayaquil";
break;
case "12":
$timezone = "America/Guayaquil";
break;
case "13":
$timezone = "America/Guayaquil";
break;
case "14":
$timezone = "America/Guayaquil";
break;
case "15":
$timezone = "America/Guayaquil";
break;
case "17":
$timezone = "America/Guayaquil";
break;
case "18":
$timezone = "America/Guayaquil";
break;
case "19":
$timezone = "America/Guayaquil";
break;
case "20":
$timezone = "America/Guayaquil";
break;
case "22":
$timezone = "America/Guayaquil";
break;
}
break;
case "ES":
switch ($region) {
case "07":
$timezone = "Europe/Madrid";
break;
case "27":
$timezone = "Europe/Madrid";
break;
case "29":
$timezone = "Europe/Madrid";
break;
case "31":
$timezone = "Europe/Madrid";
break;
case "32":
$timezone = "Europe/Madrid";
break;
case "34":
$timezone = "Europe/Madrid";
break;
case "39":
$timezone = "Europe/Madrid";
break;
case "51":
$timezone = "Africa/Ceuta";
break;
case "52":
$timezone = "Europe/Madrid";
break;
case "53":
$timezone = "Atlantic/Canary";
break;
case "54":
$timezone = "Europe/Madrid";
break;
case "55":
$timezone = "Europe/Madrid";
break;
case "56":
$timezone = "Europe/Madrid";
break;
case "57":
$timezone = "Europe/Madrid";
break;
case "58":
$timezone = "Europe/Madrid";
break;
case "59":
$timezone = "Europe/Madrid";
break;
case "60":
$timezone = "Europe/Madrid";
break;
}
break;
case "GL":
switch ($region) {
case "01":
$timezone = "America/Thule";
break;
case "02":
$timezone = "America/Godthab";
break;
case "03":
$timezone = "America/Godthab";
break;
}
break;
case "ID":
switch ($region) {
case "01":
$timezone = "Asia/Pontianak";
break;
case "02":
$timezone = "Asia/Makassar";
break;
case "03":
$timezone = "Asia/Jakarta";
break;
case "04":
$timezone = "Asia/Jakarta";
break;
case "05":
$timezone = "Asia/Jakarta";
break;
case "06":
$timezone = "Asia/Jakarta";
break;
case "07":
$timezone = "Asia/Jakarta";
break;
case "08":
$timezone = "Asia/Jakarta";
break;
case "09":
$timezone = "Asia/Jayapura";
break;
case "10":
$timezone = "Asia/Jakarta";
break;
case "11":
$timezone = "Asia/Pontianak";
break;
case "12":
$timezone = "Asia/Makassar";
break;
case "13":
$timezone = "Asia/Makassar";
break;
case "14":
$timezone = "Asia/Makassar";
break;
case "15":
$timezone = "Asia/Jakarta";
break;
case "16":
$timezone = "Asia/Makassar";
break;
case "17":
$timezone = "Asia/Makassar";
break;
case "18":
$timezone = "Asia/Makassar";
break;
case "19":
$timezone = "Asia/Pontianak";
break;
case "20":
$timezone = "Asia/Makassar";
break;
case "21":
$timezone = "Asia/Makassar";
break;
case "22":
$timezone = "Asia/Makassar";
break;
case "23":
$timezone = "Asia/Makassar";
break;
case "24":
$timezone = "Asia/Jakarta";
break;
case "25":
$timezone = "Asia/Pontianak";
break;
case "26":
$timezone = "Asia/Pontianak";
break;
case "30":
$timezone = "Asia/Jakarta";
break;
case "31":
$timezone = "Asia/Makassar";
break;
case "33":
$timezone = "Asia/Jakarta";
break;
}
break;
case "KZ":
switch ($region) {
case "01":
$timezone = "Asia/Almaty";
break;
case "02":
$timezone = "Asia/Almaty";
break;
case "03":
$timezone = "Asia/Qyzylorda";
break;
case "04":
$timezone = "Asia/Aqtobe";
break;
case "05":
$timezone = "Asia/Qyzylorda";
break;
case "06":
$timezone = "Asia/Aqtau";
break;
case "07":
$timezone = "Asia/Oral";
break;
case "08":
$timezone = "Asia/Qyzylorda";
break;
case "09":
$timezone = "Asia/Aqtau";
break;
case "10":
$timezone = "Asia/Qyzylorda";
break;
case "11":
$timezone = "Asia/Almaty";
break;
case "12":
$timezone = "Asia/Qyzylorda";
break;
case "13":
$timezone = "Asia/Aqtobe";
break;
case "14":
$timezone = "Asia/Qyzylorda";
break;
case "15":
$timezone = "Asia/Almaty";
break;
case "16":
$timezone = "Asia/Aqtobe";
break;
case "17":
$timezone = "Asia/Almaty";
break;
}
break;
case "MX":
switch ($region) {
case "01":
$timezone = "America/Mexico_City";
break;
case "02":
$timezone = "America/Tijuana";
break;
case "03":
$timezone = "America/Hermosillo";
break;
case "04":
$timezone = "America/Merida";
break;
case "05":
$timezone = "America/Mexico_City";
break;
case "06":
$timezone = "America/Chihuahua";
break;
case "07":
$timezone = "America/Monterrey";
break;
case "08":
$timezone = "America/Mexico_City";
break;
case "09":
$timezone = "America/Mexico_City";
break;
case "10":
$timezone = "America/Mazatlan";
break;
case "11":
$timezone = "America/Mexico_City";
break;
case "12":
$timezone = "America/Mexico_City";
break;
case "13":
$timezone = "America/Mexico_City";
break;
case "14":
$timezone = "America/Mazatlan";
break;
case "15":
$timezone = "America/Chihuahua";
break;
case "16":
$timezone = "America/Mexico_City";
break;
case "17":
$timezone = "America/Mexico_City";
break;
case "18":
$timezone = "America/Mazatlan";
break;
case "19":
$timezone = "America/Monterrey";
break;
case "20":
$timezone = "America/Mexico_City";
break;
case "21":
$timezone = "America/Mexico_City";
break;
case "22":
$timezone = "America/Mexico_City";
break;
case "23":
$timezone = "America/Cancun";
break;
case "24":
$timezone = "America/Mexico_City";
break;
case "25":
$timezone = "America/Mazatlan";
break;
case "26":
$timezone = "America/Hermosillo";
break;
case "27":
$timezone = "America/Merida";
break;
case "28":
$timezone = "America/Monterrey";
break;
case "29":
$timezone = "America/Mexico_City";
break;
case "30":
$timezone = "America/Mexico_City";
break;
case "31":
$timezone = "America/Merida";
break;
case "32":
$timezone = "America/Monterrey";
break;
}
break;
case "MY":
switch ($region) {
case "01":
$timezone = "Asia/Kuala_Lumpur";
break;
case "02":
$timezone = "Asia/Kuala_Lumpur";
break;
case "03":
$timezone = "Asia/Kuala_Lumpur";
break;
case "04":
$timezone = "Asia/Kuala_Lumpur";
break;
case "05":
$timezone = "Asia/Kuala_Lumpur";
break;
case "06":
$timezone = "Asia/Kuala_Lumpur";
break;
case "07":
$timezone = "Asia/Kuala_Lumpur";
break;
case "08":
$timezone = "Asia/Kuala_Lumpur";
break;
case "09":
$timezone = "Asia/Kuala_Lumpur";
break;
case "11":
$timezone = "Asia/Kuching";
break;
case "12":
$timezone = "Asia/Kuala_Lumpur";
break;
case "13":
$timezone = "Asia/Kuala_Lumpur";
break;
case "14":
$timezone = "Asia/Kuala_Lumpur";
break;
case "15":
$timezone = "Asia/Kuching";
break;
case "16":
$timezone = "Asia/Kuching";
break;
}
break;
case "NZ":
switch ($region) {
case "85":
$timezone = "Pacific/Auckland";
break;
case "E7":
$timezone = "Pacific/Auckland";
break;
case "E8":
$timezone = "Pacific/Auckland";
break;
case "E9":
$timezone = "Pacific/Auckland";
break;
case "F1":
$timezone = "Pacific/Auckland";
break;
case "F2":
$timezone = "Pacific/Auckland";
break;
case "F3":
$timezone = "Pacific/Auckland";
break;
case "F4":
$timezone = "Pacific/Auckland";
break;
case "F5":
$timezone = "Pacific/Auckland";
break;
case "F7":
$timezone = "Pacific/Chatham";
break;
case "F8":
$timezone = "Pacific/Auckland";
break;
case "F9":
$timezone = "Pacific/Auckland";
break;
case "G1":
$timezone = "Pacific/Auckland";
break;
case "G2":
$timezone = "Pacific/Auckland";
break;
case "G3":
$timezone = "Pacific/Auckland";
break;
}
break;
case "PT":
switch ($region) {
case "02":
$timezone = "Europe/Lisbon";
break;
case "03":
$timezone = "Europe/Lisbon";
break;
case "04":
$timezone = "Europe/Lisbon";
break;
case "05":
$timezone = "Europe/Lisbon";
break;
case "06":
$timezone = "Europe/Lisbon";
break;
case "07":
$timezone = "Europe/Lisbon";
break;
case "08":
$timezone = "Europe/Lisbon";
break;
case "09":
$timezone = "Europe/Lisbon";
break;
case "10":
$timezone = "Atlantic/Madeira";
break;
case "11":
$timezone = "Europe/Lisbon";
break;
case "13":
$timezone = "Europe/Lisbon";
break;
case "14":
$timezone = "Europe/Lisbon";
break;
case "16":
$timezone = "Europe/Lisbon";
break;
case "17":
$timezone = "Europe/Lisbon";
break;
case "18":
$timezone = "Europe/Lisbon";
break;
case "19":
$timezone = "Europe/Lisbon";
break;
case "20":
$timezone = "Europe/Lisbon";
break;
case "21":
$timezone = "Europe/Lisbon";
break;
case "22":
$timezone = "Europe/Lisbon";
break;
}
break;
case "RU":
switch ($region) {
case "01":
$timezone = "Europe/Volgograd";
break;
case "02":
$timezone = "Asia/Irkutsk";
break;
case "03":
$timezone = "Asia/Novokuznetsk";
break;
case "04":
$timezone = "Asia/Novosibirsk";
break;
case "05":
$timezone = "Asia/Vladivostok";
break;
case "06":
$timezone = "Europe/Moscow";
break;
case "07":
$timezone = "Europe/Volgograd";
break;
case "08":
$timezone = "Europe/Samara";
break;
case "09":
$timezone = "Europe/Moscow";
break;
case "10":
$timezone = "Europe/Moscow";
break;
case "11":
$timezone = "Asia/Irkutsk";
break;
case "13":
$timezone = "Asia/Yekaterinburg";
break;
case "14":
$timezone = "Asia/Irkutsk";
break;
case "15":
$timezone = "Asia/Anadyr";
break;
case "16":
$timezone = "Europe/Samara";
break;
case "17":
$timezone = "Europe/Volgograd";
break;
case "18":
$timezone = "Asia/Krasnoyarsk";
break;
case "20":
$timezone = "Asia/Irkutsk";
break;
case "21":
$timezone = "Europe/Moscow";
break;
case "22":
$timezone = "Europe/Volgograd";
break;
case "23":
$timezone = "Europe/Kaliningrad";
break;
case "24":
$timezone = "Europe/Volgograd";
break;
case "25":
$timezone = "Europe/Moscow";
break;
case "26":
$timezone = "Asia/Kamchatka";
break;
case "27":
$timezone = "Europe/Volgograd";
break;
case "28":
$timezone = "Europe/Moscow";
break;
case "29":
$timezone = "Asia/Novokuznetsk";
break;
case "30":
$timezone = "Asia/Vladivostok";
break;
case "31":
$timezone = "Asia/Krasnoyarsk";
break;
case "32":
$timezone = "Asia/Omsk";
break;
case "33":
$timezone = "Asia/Yekaterinburg";
break;
case "34":
$timezone = "Asia/Yekaterinburg";
break;
case "35":
$timezone = "Asia/Yekaterinburg";
break;
case "36":
$timezone = "Asia/Anadyr";
break;
case "37":
$timezone = "Europe/Moscow";
break;
case "38":
$timezone = "Europe/Volgograd";
break;
case "39":
$timezone = "Asia/Krasnoyarsk";
break;
case "40":
$timezone = "Asia/Yekaterinburg";
break;
case "41":
$timezone = "Europe/Moscow";
break;
case "42":
$timezone = "Europe/Moscow";
break;
case "43":
$timezone = "Europe/Moscow";
break;
case "44":
$timezone = "Asia/Magadan";
break;
case "45":
$timezone = "Europe/Samara";
break;
case "46":
$timezone = "Europe/Samara";
break;
case "47":
$timezone = "Europe/Moscow";
break;
case "48":
$timezone = "Europe/Moscow";
break;
case "49":
$timezone = "Europe/Moscow";
break;
case "50":
$timezone = "Asia/Yekaterinburg";
break;
case "51":
$timezone = "Europe/Moscow";
break;
case "52":
$timezone = "Europe/Moscow";
break;
case "53":
$timezone = "Asia/Novosibirsk";
break;
case "54":
$timezone = "Asia/Omsk";
break;
case "55":
$timezone = "Europe/Samara";
break;
case "56":
$timezone = "Europe/Moscow";
break;
case "57":
$timezone = "Europe/Samara";
break;
case "58":
$timezone = "Asia/Yekaterinburg";
break;
case "59":
$timezone = "Asia/Vladivostok";
break;
case "60":
$timezone = "Europe/Kaliningrad";
break;
case "61":
$timezone = "Europe/Volgograd";
break;
case "62":
$timezone = "Europe/Moscow";
break;
case "63":
$timezone = "Asia/Yakutsk";
break;
case "64":
$timezone = "Asia/Sakhalin";
break;
case "65":
$timezone = "Europe/Samara";
break;
case "66":
$timezone = "Europe/Moscow";
break;
case "67":
$timezone = "Europe/Samara";
break;
case "68":
$timezone = "Europe/Volgograd";
break;
case "69":
$timezone = "Europe/Moscow";
break;
case "70":
$timezone = "Europe/Volgograd";
break;
case "71":
$timezone = "Asia/Yekaterinburg";
break;
case "72":
$timezone = "Europe/Moscow";
break;
case "73":
$timezone = "Europe/Samara";
break;
case "74":
$timezone = "Asia/Krasnoyarsk";
break;
case "75":
$timezone = "Asia/Novosibirsk";
break;
case "76":
$timezone = "Europe/Moscow";
break;
case "77":
$timezone = "Europe/Moscow";
break;
case "78":
$timezone = "Asia/Yekaterinburg";
break;
case "79":
$timezone = "Asia/Irkutsk";
break;
case "80":
$timezone = "Asia/Yekaterinburg";
break;
case "81":
$timezone = "Europe/Samara";
break;
case "82":
$timezone = "Asia/Irkutsk";
break;
case "83":
$timezone = "Europe/Moscow";
break;
case "84":
$timezone = "Europe/Volgograd";
break;
case "85":
$timezone = "Europe/Moscow";
break;
case "86":
$timezone = "Europe/Moscow";
break;
case "87":
$timezone = "Asia/Novosibirsk";
break;
case "88":
$timezone = "Europe/Moscow";
break;
case "89":
$timezone = "Asia/Vladivostok";
break;
}
break;
case "UA":
switch ($region) {
case "01":
$timezone = "Europe/Kiev";
break;
case "02":
$timezone = "Europe/Kiev";
break;
case "03":
$timezone = "Europe/Uzhgorod";
break;
case "04":
$timezone = "Europe/Zaporozhye";
break;
case "05":
$timezone = "Europe/Zaporozhye";
break;
case "06":
$timezone = "Europe/Uzhgorod";
break;
case "07":
$timezone = "Europe/Zaporozhye";
break;
case "08":
$timezone = "Europe/Simferopol";
break;
case "09":
$timezone = "Europe/Kiev";
break;
case "10":
$timezone = "Europe/Zaporozhye";
break;
case "11":
$timezone = "Europe/Simferopol";
break;
case "13":
$timezone = "Europe/Kiev";
break;
case "14":
$timezone = "Europe/Zaporozhye";
break;
case "15":
$timezone = "Europe/Uzhgorod";
break;
case "16":
$timezone = "Europe/Zaporozhye";
break;
case "17":
$timezone = "Europe/Simferopol";
break;
case "18":
$timezone = "Europe/Zaporozhye";
break;
case "19":
$timezone = "Europe/Kiev";
break;
case "20":
$timezone = "Europe/Simferopol";
break;
case "21":
$timezone = "Europe/Kiev";
break;
case "22":
$timezone = "Europe/Uzhgorod";
break;
case "23":
$timezone = "Europe/Kiev";
break;
case "24":
$timezone = "Europe/Uzhgorod";
break;
case "25":
$timezone = "Europe/Uzhgorod";
break;
case "26":
$timezone = "Europe/Zaporozhye";
break;
case "27":
$timezone = "Europe/Kiev";
break;
}
break;
case "UZ":
switch ($region) {
case "01":
$timezone = "Asia/Tashkent";
break;
case "02":
$timezone = "Asia/Samarkand";
break;
case "03":
$timezone = "Asia/Tashkent";
break;
case "06":
$timezone = "Asia/Tashkent";
break;
case "07":
$timezone = "Asia/Samarkand";
break;
case "08":
$timezone = "Asia/Samarkand";
break;
case "09":
$timezone = "Asia/Samarkand";
break;
case "10":
$timezone = "Asia/Samarkand";
break;
case "12":
$timezone = "Asia/Samarkand";
break;
case "13":
$timezone = "Asia/Tashkent";
break;
case "14":
$timezone = "Asia/Tashkent";
break;
}
break;
case "TL":
$timezone = "Asia/Dili";
break;
case "PF":
$timezone = "Pacific/Marquesas";
break;
}
return $timezone;
}
function normalizeURI($uri) {
$uri=quoted_printable_decode($uri);
if (preg_match("/^(.*)/",$uri,$m)) {
if (preg_match("/^(.*):/U",$m[2],$p)){
$uri=$m[1]."@".$p[1].">";
} else {
$uri=$m[1]."@".$m[2];
}
} else if (preg_match("/^(sips?:.*)[=:;]/U",$uri,$p)) {
$uri=$p[1];
}
return $uri;
}
function normalizeTime($period) {
$sec=$period%60;
$min=floor($period/60);
$h=floor($min/60);
if (!$period) return ;
if ($h>0) {
$min=$min-60*$h;
}
if ($h >= 1) {
return sprintf('%dh%02d\'%02d"', $h, $min, $sec);
} else {
return sprintf('%d\'%02d"', $min, $sec);
}
}
function checkURI($uri) {
//dprint ("checkURI($uri) ");
if ($uri == "") return true;
if (preg_match("/^(sip:|sips:)(.*)$/",$uri,$m)) $uri=$m[2];
$regexp = "/^(\+?[a-z0-9*][a-z0-9_.*-]*)@([a-z0-9][a-z0-9-]*\.)+(([a-z]{2,})|(\d+))$/i";
if (stristr($uri,"-.") ||
!preg_match($regexp, $uri)) {
print "Invalid URI \"$uri\". ";
return false;
}
return true;
}
function checkPhonebookURI($uri) {
$regexp = "/^sip:([a-z0-9%_.-]*)@([a-z0-9%.-]*)$/i";
if (stristr($contact,"-.") || !preg_match($regexp, $uri)) {
print "Invalid URI \"$uri\". ";
return false;
}
return true;
}
function getLocalTime($timezone, $timestamp) {
$tz = getenv('TZ');
putenv("TZ=$timezone");
if (!$timestamp) {
return;
}
$LocalTime = date("Y-m-d H:i:s", $timestamp);
putenv("TZ=$tz");
return $LocalTime;
}
function getSipThorHomeNode ($account,$sip_proxy) {
if (!$account || !$sip_proxy) return false;
$socket = fsockopen($sip_proxy, 9500, $errno, $errstr, 1);
if (!$socket) {
return false;
}
$request=sprintf("lookup sip_proxy for %s",$account);
if (fputs($socket,"$request\r\n") !== false) {
$ret = fgets($socket,4096);
}
fclose($socket);
return $ret;
}
function getSipAccountFromX509Certificate($account='') {
if (!$account) {
print _('Error, please specify an account');
return false;
}
list($username, $domain) = explode("@",$account);
if (!$username || !$domain) {
print _("Invalid account provided");
return false;
}
if (!$_SERVER[SSL_CLIENT_CERT]) {
print _("Error: No X.509 client certificate provided\n");
return false;
}
if (!$cert=openssl_x509_parse($_SERVER[SSL_CLIENT_CERT])) {
print _("Error: Failed to parse X.509 client certificate\n");
return false;
}
require("/etc/cdrtool/ngnpro_engines.inc");
global $domainFilters, $resellerFilters, $soapEngines;
if ($domainFilters[$domain]['sip_engine']) {
$credentials['engine'] = $domainFilters[$domain]['sip_engine'];
$credentials['customer'] = $domainFilters[$domain]['customer'];
$credentials['reseller'] = $domainFilters[$domain]['reseller'];
} else if ($domainFilters['default']['sip_engine']) {
$credentials['engine']=$domainFilters['default']['sip_engine'];
} else {
print "Error: no domainFilter available in ngnpro_engines.inc";
return false;
}
$SOAPlogin=array(
"username" => $soapEngines[$credentials['engine']]['username'],
"password" => $soapEngines[$credentials['engine']]['password'],
"admin" => true
);
$SoapAuth = array('auth', $SOAPlogin , 'urn:AGProjects:NGNPro', 0, '');
$SipPort = new WebService_NGNPro_SipPort($soapEngines[$credentials['engine']]['url']);
$SipPort->_options['timeout'] = 5;
$SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$SipPort->addHeader($SoapAuth);
// Filter
$filter=array('username' => $username,
'domain' => $domain,
'owner' => intval($cert['subject']['CN'])
);
// Range
$range=array('start' => 0,
'count' => 10
);
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query=array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Call function
$result = $SipPort->getAccounts($Query);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
printf ("Error from %s (SipPort): %s (%s): %s",$soapEngines[$credentials['engine']]['url'],$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
return false;
}
if ($result->total != 1) {
return false;
}
$credentials['account'] = $account;
$credentials['customer'] = $result->customer;
$credentials['reseller'] = $result->reseller;
return $credentials;
}
function getSipAccountFromHTTPDigest () {
require("/etc/cdrtool/enrollment/config.ini");
if (!is_array($enrollment) || !strlen($enrollment['nonce_key'])) {
$log= 'Error: Missing nonce in enrollment settings';
syslog(LOG_NOTICE, $log);
die($log);
return false;
}
if ($_REQUEST['realm']) {
// required by Blink cocoa
$realm=$_REQUEST['realm'];
$a=explode("@",$realm);
if (count($a) == 2) {
$realm = $a[1];
}
} else {
$realm = 'SIP_settings';
}
// security implemented based on
// http://static.springsource.org/spring-security/site/docs/2.0.x/reference/digest.html
$_id = microtime(true)+ 300; // expires 5 minutes in the future
$_key = $enrollment['nonce_key'];
$nonce = base64_encode($_id.":".md5($_id.":".$_key));
if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"');
//syslog(LOG_NOTICE, sprintf ("SIP settings page: sent auth request for realm %s to %s", $realm, $_SERVER['REMOTE_ADDR']));
die();
}
// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset($data['username'])) {
$log=sprintf("SIP settings page: Invalid credentials from %s", $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
die($log);
}
// generate the valid response
$username = $data['username'];
if (strstr($username, '@')) {
$a = explode("@",$username);
$username = $a[0];
$domain = $a[1];
} else {
$domain = $realm;
}
require("/etc/cdrtool/ngnpro_engines.inc");
global $domainFilters, $resellerFilters, $soapEngines ;
$credentials['account'] = sprintf("%s@%s",$username, $domain);
if ($domainFilters[$domain]['sip_engine']) {
$credentials['engine'] = $domainFilters[$domain]['sip_engine'];
$credentials['customer'] = $domainFilters[$domain]['customer'];
$credentials['reseller'] = $domainFilters[$domain]['reseller'];
} else if ($domainFilters['default']['sip_engine']) {
$credentials['engine']=$domainFilters['default']['sip_engine'];
} else {
$log=sprintf("SIP settings page error: no domainFilter available in ngnpro_engines.inc from %s", $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
die();
}
$SOAPlogin=array(
"username" => $soapEngines[$credentials['engine']]['username'],
"password" => $soapEngines[$credentials['engine']]['password'],
"admin" => true
);
$SoapAuth = array('auth', $SOAPlogin , 'urn:AGProjects:NGNPro', 0, '');
$SipPort = new WebService_NGNPro_SipPort($soapEngines[$credentials['engine']]['url']);
$SipPort->_options['timeout'] = 5;
$SipPort->setOpt('curl', CURLOPT_SSL_VERIFYPEER, 0);
$SipPort->setOpt('curl', CURLOPT_SSL_VERIFYHOST, 0);
$SipPort->addHeader($SoapAuth);
$result = $SipPort->getAccount(array("username" =>$username,"domain" =>$domain));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"');
$log=sprintf("SIP settings page error: non-existent username %s from %s", $credentials['account'], $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
die();
}
$web_password='';
foreach ($result->properties as $_property) {
if ($_property->name == 'web_password') {
//$web_password = explode(":", $_property->value, -1);
$split=explode(":",$_property->value);
$web_password=$split['0'];
break;
}
}
if (!empty($web_password)) {
//$A1 = md5($data['username'] . ':' . $realm . ':' . $data['password']);
$A1 = $web_password;
$login_type_log = 'web password';
//$log=sprintf("TEST %s %s %s %s", $data['username'], $realm, $web_password , $data['nonce']);
//syslog(LOG_NOTICE, $log);
// } else if (strstr($data['username'], '@')) {
// $A1 = md5($data['username'] . ':' . $realm . ':' . $result->password);
// $login_type_log = 'cleartext legacy password';
} else if ($result->ha1) {
$login_type_log = sprintf('encrypted password');
$A1 = $result->ha1;
} else {
$A1 = md5($data['username'] . ':' . $realm . ':' . $result->password);
$login_type_log = 'cleartext password';
}
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);
if ($data['response'] != $valid_response ) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"');
$log=sprintf("SIP settings page error: wrong credentials using %s for %s from %s", $login_type_log, $credentials['account'], $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
die();
}
// check nonce
$client_nonce_els=explode(":",base64_decode($data['nonce']));
if (md5($client_nonce_els[0].":".$_key) != $client_nonce_els[1]) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.$nonce.'",opaque="'.md5($realm).'"');
$log=sprintf("SIP settings page error: wrong nonce for %s from %s", $credentials['account'], $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
die();
}
if (microtime(true) > $client_nonce_els[0]) {
// nonce is stale
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.$nonce.'",stale=true,opaque="'.md5($realm).'"');
$log=sprintf("SIP settings page error: nonce has expired for %s from %s", $username, $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
die();
}
$log=sprintf("SIP settings page: %s logged in using %s from %s", $credentials['account'], $login_type_log, $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
$credentials['customer'] = $result->customer;
$credentials['reseller'] = $result->reseller;
return $credentials;
}
function http_digest_parse($txt) {
// function to parse the http auth header
// protect against missing data
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));
preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
foreach ($matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset($needed_parts[$m[1]]);
}
return $needed_parts ? false : $data;
}
function renderUI($SipSettings_class,$account,$login_credentials,$soapEngines) {
// Generic code for all sip settings pages
$SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines);
if ($_REQUEST['action']) {
$log_action=$_REQUEST['action'];
} else {
$log_action='load main page';
}
$log=sprintf("SIP settings page: %s for %s from %s", $log_action, $account, $_SERVER['REMOTE_ADDR']);
syslog(LOG_NOTICE, $log);
if (!strstr($_REQUEST['action'],'get_') &&
!strstr($_REQUEST['action'],'set_') &&
!strstr($_REQUEST['action'],'put_') &&
!strstr($_REQUEST['action'],'delete_') &&
!strstr($_REQUEST['action'],'export_') &&
!strstr($_REQUEST['action'],'add_')) {
$title = "$account";
if (array_key_exists($SipSettings->tab, $SipSettings->tabs)) {
$title = $SipSettings->tabs[$SipSettings->tab]. " - ". $title;
}
$header = $SipSettings->headerFile;
$css = $SipSettings->cssFile;
$auto_refesh_tab=$SipSettings->auto_refesh_tab;
$absolute_url= $SipSettings->absolute_url;
include($header);
dprint("Header file $header included, refresh=$auto_refesh_tab");
include($css);
dprint("CSS file $css included");
}
if ($_REQUEST['action']=="save settings") {
if ($SipSettings->checkSettings()) {
$SipSettings->saveSettings();
unset($SipSettings);
$SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines);
} else {
print "";
printf (_("Error: %s"),$SipSettings->error);
print "";
}
} else if ($_REQUEST['action']=="set diversions") {
$SipSettings->setDiversions();
unset($SipSettings);
$SipSettings = new $SipSettings_class($account,$login_credentials,$soapEngines);
} else if ($_REQUEST['action']=="set barring") {
$SipSettings->setBarringPrefixes();
} else if ($_REQUEST['action']=="set reject") {
$SipSettings->setRejectMembers();
} else if ($_REQUEST['action']=="set accept rules") {
$SipSettings->setAcceptRules();
} else if ($_REQUEST['action']=="set aliases") {
$SipSettings->setAliases();
} else if ($_REQUEST['action']=="send email") {
$SipSettings->sendEmail();
} else if ($_REQUEST['action']=="delete account") {
$SipSettings->deleteAccount();
} else if ($_REQUEST['action']=="delete_account") {
// print " ";
// print_r($SipSettings->Preferences);
$date1= new datetime($SipSettings->Preferences['account_delete_request']);
$today= new datetime('now');
if ($date1->diff($today)->d <= '2' && $SipSettings->Preferences['account_delete_request'] ) {
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->deleteAccount($SipSettings->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$return=array('success' => false,
'error_message' => $_msg
);
return false;
} else {
printf("The account %s has been removed ",$SipSettings->account);
$SipSettings->sendRemoveAccount();
//print ""
print "";
print _("Click here to Logout");
print "";
//$auth->logout();
//$sess->delete();
return true;
}
} else {
printf("The delete request for account %s has expired or is not valid",$SipSettings->account);
return false;
}
return true ;
//$SipSettings->deleteAccount();
} else if ($_REQUEST['action']=="get_crt") {
$SipSettings->exportCertificateX509();
return true;
} else if ($_REQUEST['action']=="get_p12") {
$SipSettings->exportCertificateP12();
return true;
} else if ($_REQUEST['action'] == 'get_balance_history') {
$SipSettings->getBalanceHistory();
if ($_REQUEST['csv']) {
$SipSettings->exportBalanceHistory();
} else {
print json_encode($SipSettings->balance_history);
}
return true;
} else if ($_REQUEST['action'] == 'get_call_forwarding') {
$SipSettings->getDiversions();
print json_encode($SipSettings->diversions);
return true;
} else if ($_REQUEST['action'] == 'get_prepaid') {
$SipSettings->getPrepaidStatus();
print json_encode($SipSettings->prepaidAccount);
return true;
} else if ($_REQUEST['action'] == 'get_monthly_usage') {
$SipSettings->getCallStatistics();
print json_encode($SipSettings->thisMonth);
return true;
} else if ($_REQUEST['action'] == 'get_accept_rules'){
$SipSettings->getAcceptRules();
print json_encode($SipSettings->acceptRules);
return true;
} else if ($_REQUEST['action'] == 'get_journal_entries'){
$SipSettings->getJournalEntries();
print json_encode($SipSettings->journalEntries);
return true;
} else if ($_REQUEST['action'] == 'put_journal_entries'){
print json_encode($SipSettings->putJournalEntries());
return true;
} else if ($_REQUEST['action'] == 'delete_journal_entries'){
print json_encode($SipSettings->deleteJournalEntries());
return true;
} else if ($_REQUEST['action'] == 'get_reject_rules'){
$SipSettings->getRejectMembers();
print json_encode($SipSettings->rejectMembers);
return true;
} else if ($_REQUEST['action'] == 'get_history'){
$SipSettings->getHistory('completed');
print json_encode($SipSettings->call_history);
return true;
} else if ($_REQUEST['action'] == 'get_voicemail'){
$SipSettings->getVoicemail();
print json_encode($SipSettings->voicemail);
return true;
} else if ($_REQUEST['action'] == 'get_aliases'){
$SipSettings->getAliases();
print json_encode($SipSettings->aliases);
return true;
} else if ($_REQUEST['action'] == 'get_enum'){
$SipSettings->getEnumMappings();
print json_encode($SipSettings->enums);
return true;
} else if ($_REQUEST['action'] == 'export_identity_proof'){
$SipSettings->exportIdentityProof();
return true;
} else if ($_REQUEST['action'] == 'add_balance'){
if (!$_REQUEST['id'] || !$_REQUEST['number']) {
$return=array('success' => false,
'error_message' => 'Missing id or number'
);
print (json_encode($return));
return false;
}
$card = array('id' => intval($_REQUEST['id']),
'number' => $_REQUEST['number']
);
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->addBalanceFromVoucher($SipSettings->sipId,$card);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$return=array('success' => false,
'error_message' => $_msg
);
print (json_encode($return));
return false;
} else {
$return=array('success' => true,
'error_message' => 'Added balance succeeded'
);
print (json_encode($return));
return true;
}
} else if ($_REQUEST['action'] == 'get_identity'){
$account=array('sip_address' => $SipSettings->account,
'email' => $SipSettings->email,
'first' => $SipSettings->firstName,
'lastname' => $SipSettings->lastName,
'pstn_caller_id' => $SipSettings->rpid,
'mobile_number' => $SipSettings->mobile_number,
'timezone' => $SipSettings->timezone,
'no_answer_timeout' => $SipSettings->timeout,
'quick_dial' => $SipSettings->quickdial
);
print json_encode($account);
return true;
} else if ($_REQUEST['action'] == 'get_devices'){
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->getSipDeviceLocations(array($SipSettings->sipId));
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return false;
} else {
foreach ($result[0]->locations as $locationStructure) {
$contact=$locationStructure->address.":".$locationStructure->port;
if ($locationStructure->publicAddress) {
$publicContact=$locationStructure->publicAddress.":".$locationStructure->publicPort;
} else {
$publicContact=$contact;
}
$devices[]=array("contact" => $contact,
"publicContact" => $publicContact,
"expires" => $locationStructure->expires,
"user_agent" => $locationStructure->userAgent,
"transport" => $locationStructure->transport
);
}
}
print (json_encode($devices));
return true;
} else if ($_REQUEST['action'] == 'set_dnd_on'){
$SipSettings->getAcceptRules();
$SipSettings->acceptRules['temporary']=array('groups' =>array('nobody'),
'duration' =>intval($_REQUEST['duration'])
);
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->setAcceptRules($SipSettings->sipId,$SipSettings->acceptRules);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
} else {
$_ret=true;
if (intval($_REQUEST['duration'] > 0)) {
$_msg=sprintf(_('Do not disturb has been enabled for %d minutes'),intval($_REQUEST['duration']));
} else {
$_msg=sprintf(_('Do not disturb has been enabled'));
}
}
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
} else if ($_REQUEST['action'] == 'set_dnd_off'){
$SipSettings->getAcceptRules();
$SipSettings->acceptRules['temporary']=array('groups' =>array('everybody'),
'duration' =>0
);
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->setAcceptRules($SipSettings->sipId,$SipSettings->acceptRules);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
} else {
$_ret=true;
$_msg=sprintf(_('Do not disturb has been disabled'));
}
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
} else if ($_REQUEST['action'] == 'set_privacy_on'){
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->addToGroup(array("username" => $SipSettings->username,"domain"=> $SipSettings->domain),"anonymous");
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
} else {
$_ret=true;
$_msg=sprintf(_('Caller-ID is now hidden for outgoing calls'));
}
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
} else if ($_REQUEST['action'] == 'set_privacy_off'){
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->removeFromGroup(array("username" => $SipSettings->username,"domain"=> $SipSettings->domain),"anonymous");
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 1031) {
$_ret=true;
$_msg=sprintf(_('Caller-ID is now visible for outgoing calls'));
} else {
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
}
} else {
$_ret=true;
$_msg=sprintf(_('Caller-ID is now visible for outgoing calls'));
}
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
} else if ($_REQUEST['action'] == 'add_alias'){
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$username=trim($_REQUEST['username']);
if (!strlen($username)) {
$return=array('success' => false,
'error_message' => 'Error: missing username'
);
print (json_encode($return));
return false;
}
$_aliasObject=array("id"=>array("username"=>strtolower($username),
"domain"=>$SipSettings->domain
),
"owner" => intval($SipSettings->owner),
"target"=> array("username" => $SipSettings->username,"domain"=> $SipSettings->domain)
)
;
$result = $SipSettings->SipPort->addAlias($_aliasObject);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
} else {
$_ret=true;
$_msg=sprintf(_('Added alias %s'),strtolower($username));
}
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
} else if ($_REQUEST['action'] == 'set_call_forwarding') {
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->getCallDiversions($SipSettings->sipId);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
}
$SipSettings->getVoicemail();
foreach(array_keys($SipSettings->diversionType) as $condition) {
$old_diversions[$condition]=$result->$condition;
}
$_log='';
foreach(array_keys($old_diversions) as $key) {
if (isset($_REQUEST[$key])) {
printf ("Key $key changed %s",$_REQUEST[$key]);
$textboxURI=$_REQUEST[$key];
if ($textboxURI == "" && strlen($SipSettings->mobile_number)) {
$textboxURI = $SipSettings->mobile_number;
}
if ($textboxURI && $textboxURI != "" && !preg_match("/@/",$textboxURI)) {
$textboxURI=$textboxURI."@".$SipSettings->domain;
}
if (preg_match("/^([\+|0].*)@/",$textboxURI,$m)) {
$textboxURI=$m[1]."@".$SipSettings->domain;
}
if (strlen($textboxURI) && $textboxURI != "" && !preg_match("/^sip:/",$textboxURI)) {
$textboxURI='sip:'.$textboxURI;
}
if ($textboxURI) {
$new_diversions[$key]=$textboxURI;
}
$_log.=sprintf("%s=%s ",$key,$textboxURI);
$divert_changed=true;
} else {
if ($old_diversions[$key]) {
$new_diversions[$key]=$old_diversions[$key];
}
}
}
if ($divert_changed) {
$SipSettings->SipPort->addHeader($SipSettings->SoapAuth);
$result = $SipSettings->SipPort->setCallDiversions($SipSettings->sipId,$new_diversions);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
$_msg=sprintf ("Error (SipPort): %s (%s): %s",$error_msg, $error_fault->detail->exception->errorcode,$error_fault->detail->exception->errorstring);
$_ret=false;
} else {
$_ret=true;
$_msg=sprintf(_('Changed diversions %s'),$_log);
}
$return=array('success' => $_ret,
'error_message' => $_msg
);
print (json_encode($return));
return true;
} else {
$return=array('success' => true,
'error_message' => 'Diversions remained the same'
);
print (json_encode($return));
return true;
}
} else if ($_REQUEST['action']) {
$return=array('success' => false,
'error_message' => "Error: invalid action"
);
print (json_encode($return));
return false;
}
if (!$_REQUEST['export']) {
$SipSettings->showAccount();
print "
|